在ANTLR中匹配相似项而不捕获差异

在ANTLR中匹配相似项而不捕获差异,antlr,antlr4,nand2tetris,Antlr,Antlr4,Nand2tetris,作为挑战的一部分,我正在尝试使用ANTLR编写一个解析器来生成机器代码,并且已经使用正则表达式实现了它 然而,我正在努力研究如何有效地使用ANTLR。下面是问题的一个子集 (一些)有效的指示 (部分)正则表达式 现在,正如你所看到的,lexer将在什么是计算和什么是赋值之间混淆,因为两者都可能是“A” 但是,如果我将作业更改为 ASSIGNMENT : DESTINATION '=' ; 命令 command : assignment computation | etc...

作为挑战的一部分,我正在尝试使用ANTLR编写一个解析器来生成机器代码,并且已经使用正则表达式实现了它

然而,我正在努力研究如何有效地使用ANTLR。下面是问题的一个子集

(一些)有效的指示 (部分)正则表达式 现在,正如你所看到的,lexer将在什么是计算和什么是赋值之间混淆,因为两者都可能是“A”

但是,如果我将作业更改为

ASSIGNMENT
  : DESTINATION '='
  ;
命令

command
  : assignment computation
  | etc...
然后赋值取等号

因此,我试图在不同的上下文中匹配两个标记(FOO和FOO=),但我对=,只对FOO不感兴趣


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

让lexer将“A”标记为1种特定的标记类型,并让解析器决定在什么上下文中接受什么标记类型。大多数时候,只有解析器得到了上下文信息是的,找到了错误的树——我脑子里的概念完全错了。现在似乎已经开始工作了-谢谢!
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...
     ;
ASSIGNMENT
  : DESTINATION '='
  ;
command
  : assignment computation
  | etc...