交付一:factor 和 term
(每道题开头都有同一段:T() 是上一站 lexer 的替身——源码里 token 之间用空格分开,它切成 (kind, text, line, col);show() 把树写成一行:二元运算全加括号,语句之间用 |。)
玩具语言的文法(八节共用):program := stmt*;stmt := "let" IDENT "=" expr ";" | IDENT "=" expr ";" | "if" "(" expr ")" block ("else" block)? | "while" "(" expr ")" block;block := "{" stmt* "}";expr := comparison;comparison := sum ((">=" | "<=" | "==" | "!=" | "<" | ">") sum)?;sum := term (("+" | "-") term)*;term := factor (("*" | "/") factor)*;factor := NUMBER | STRING | IDENT | "(" expr ")"。
从零写出 factor(数字、字符串、名字、括号,否则抛「表达式」)和 term(factor 之间用 * / 左结合)。
全部评论