交付三:四种语句
(每道题开头都有同一段: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 ")"。
从零写出 stmt:看开头分 let / if / while / 赋值四路(block 已给)。
全部评论