作为nand2tetris挑战的一部分,我正在尝试使用ANTLR编写解析器来生成机器代码,已经使用正则表达式实现了它。
然而,我正在努力研究如何有效地使用ANTLR。问题的一个子集如下。
M=D
D=M
M=D+1
D;JMP
0;JMP
(?<assignment>(?<destination>[ADM])=)?(?<computation>[ADM+10])(?<condition>;(?<jump>JMP))?
command
: assignment '=' computation
| computation ';' condition
| assignment '=' computation ';' condition
;
assignment
: ASSIGNMENT
;
computation
: OPERATION
;
condition
: CONDITION
;
ASSIGNMENT
: DESTINATION
;
CONDITION
: JUMP
;
DESTINATION
: 'A'
| 'D'
| ...etc
;
OPERATION
: 'A'
| 'D'
| 'A+D'
| ... etc
;
JUMP
: JMP
| JLE
| etc...
;
现在,正如你所看到的,词法分析器会在计算和赋值之间混淆,因为两者都可能是'A'......
但是,如果我将ASSIGNMENT更改为
ASSIGNMENT
: DESTINATION '='
;
并命令
command
: assignment computation
| etc...
然后作业将获得等号。
所以,我试图在不同的上下文中匹配两个令牌(FOO和FOO =),但我对=只有FOO不感兴趣。
我是否完全用当前的方法咆哮错误的树?