ANTLR と Java を使用してコンパイラを作成しようとしています。ルールがあり、その一部だけを使用できないという問題があります。0: HALT 0,0,0 などのコマンドがあり、その後はすべて無視したいと考えています。
eg0: HALT 0,0,0 何とか何とか何とか、何とか無視したい
私のルールは次のとおりです。
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
したがって、最初の行を正しく解析し、2 行目を 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;};