作为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
: DESTINATION '='
;
并命令
command
: assignment computation
| etc...
然后赋值拿起等号。
所以,我试图在不同的上下文中匹配两个标记(FOO 和 FOO=),但我对 = 不感兴趣,只对 FOO 感兴趣。
我是否完全用当前的方法吠错了树?