我在 OCamlyacc 和 OCamllex 中实现以下语法:
我的 IF-ELSE 子句的 OCaml 类型声明如下:
(* Some code not shown *)
and stmt = ASSIGN of lv * exp
| IF of exp * stmt * stmt
| WHILE of exp * stmt
| DOWHILE of stmt * exp
| READ of id
| PRINT of exp
| BLOCK of block
(* Some code not shown *)
我可以这样定义 OCamlyacc 中的 IF-ELSE 部分:
stmt:
| IF LPAREN e RPAREN stmt { S.IF ($3, $5, ???) } /*line 1*/
| IF LPAREN e RPAREN stmt ELSE stmt { S.IF ($3, $5, $7) } /*line 2*/
但是,如何将“NULL”用于语句类型(“stmt”),其中问号用于没有 ELSE的IF 语句(第 1 行)?我无法访问只有一个表达式(“exp”)和一个语句的语句类型。
我考虑过在那里放一个“while(0){print(0)}”语句,但这不是你应该做的,特别是因为它会在不应该的时候解析一个while 语句。