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