0

作为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 感兴趣。

我是否完全用当前的方法吠错了树?

4

0 回答 0