我正在尝试用 Java (使用CUP)创建一个可以识别这段代码的语法分析器:
if ¿b? then
~ a = 2;
~ if ¿b && c? then
~ ~ a = 3;
else
~ a = 4;
“if”语句使用的我的产品如下:
Instr ::= ...
| IF CONOP Exp:e CONCL THEN CondInstrList:l
...
;
...
CondInstrList ::= CondInstrList CondInstr
| /*empty*/
;
...
CondInstr ::= CONTROLD Instr
| CONTROLD CondInstr
;
其中 Instr 代表指令/语句,CondInstrList 代表条件指令列表,CONTROLD 代表控制短划线 (~)。(CONOP 和 CONCL 表示条件打开/关闭)
问题在于,使用该语法,生成的 AST 如下:
if
|-condition b
|-condInstrListT
|---asig a = 2
|---if
|---condition b and c
|---condInstrListT
| |---asig a = 2
|---condInstrListF
|---asig a = 4
因此,“else”部分与内部“if”相关联。
我只是不知道如何编写一个尊重我想要的语言方式的语法。
任何帮助表示赞赏。
如果需要,我可以提供更多细节。