【发布时间】:2012-08-24 17:58:57
【问题描述】:
我正在尝试使用 ANTLR 和 Java 创建编译器。我有这个问题,我有一个规则,我不能只使用它的一部分。我有一个命令,例如0:HALT 0,0,0,之后我想忽略其他所有内容。
e.g.0: HALT 0,0,0 blah blah blah,我想忽略 blah blah blah
我的规则是:
rule returns [String value]
:
INTEGER':' ro=rocommand i1=INTEGER',' i2=INTEGER ',' i3=INTEGER rest {$value = $ro.text+" "+$i1.text+","+$i2.text+","+$i3.text; }
| INTEGER':' rm=rmcommand j1=INTEGER ',' j2=INTEGER '('j3=INTEGER')' rest {$value = $rm.text+" "+$j1.text+","+$j2.text+"("+$j3.text+")"; }
;
我的代码是:
CharStream charStream = new ANTLRStringStream(strLine);
simulatorLexer lexer = new simulatorLexer(charStream);
TokenStream tokenStream = new CommonTokenStream(lexer);
simulatorParser parser = new simulatorParser(tokenStream);
System.out.println(parser.rule());
我得到的是:
0: rule:IN 0,0,0
1: rule:LDC 1,1,0
line 1:15 no viable alternative at character 'r'
line 1:18 no viable alternative at character '='
line 1:15 no viable alternative at character 'i'
对于正文:
0: rule:IN 0,0,0
1: rule:LDC 1,1,0 r1=0
所以它应该正确解析第一行和第二行直到 0。然后它应该忽略 r1=0。到目前为止它工作正常,但它显示了许多错误,我想摆脱它们。请帮帮我!
编辑
我正在发布整个语法,以便您可以更好地帮助我。我只想认清规则部分。
program:
rule+
;
rocommand:
'HALT'|'IN'|'OUT'|'ADD'|'SUB'|'MUL'|'DIV'|'LDC'
;
rmcommand:
'LD'|'LDA'|'LDC'|'ST'|'JLT'|'JLE'|'JGE'|'JGT'|'JEQ'|'JNE'
;
rest:
~('\n'|'\r')* '\r'? ('\n'|EOF)
;
rule returns [String value]
:
INTEGER':' ro=rocommand i1=INTEGER',' i2=INTEGER ',' i3=INTEGER rest {$value = $ro.text+" "+$i1.text+","+$i2.text+","+$i3.text; }
| INTEGER':' rm=rmcommand j1=INTEGER ',' j2=INTEGER '('j3=INTEGER')' rest {$value = $rm.text+" "+$j1.text+","+$j2.text+"("+$j3.text+")"; }
;
WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};
INTEGER : '0'..'9'+;
IGNORELINE : '*' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;};
【问题讨论】:
-
您能否发布一个自包含语法,以便我(或其他人)可以针对您的输入运行生成的解析器?如果不了解更多语法,就不可能知道哪里出了问题。
-
是的,你是对的,我刚刚编辑了原始帖子并发布了我的语法。希望你能帮助我,谢谢!