交付二:sum 和 comparison
(每道题开头都有同一段: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 ")"。
从零写出 sum_(term 之间 + - 左结合)和 comparison(sum 之间最多一个比较运算符)。
全部评论