1
我想寫一本語法來處理二進制數,並計算它們的值:處理EOF,空格和新線ANTLR
grammar T;
options
{
backtrack=true;
}
prog :
(b2 = binarynum NEWLINE)+ EOF {System.out.println($binarynum.value);}
|
b1 = binarynum EOF {System.out.println($binarynum.value);}
;
binarynum returns [double value] :
s1=string '.' s2=string
{$value = $s1.value + $s2.value/Math.pow(2.0,$s2.length);}
|
string
{$value = $string.value;}
;
string returns [double value, int length] :
bit s2=string
{$value = $bit.value*Math.pow(2.0,$s2.length)+$s2.value; $length = $s2.length+1; }
|
bit
{$value = $bit.value; $length = 1; }
;
bit returns [double value] :
'0'
{ $value = 0;}
|
'1'
{ $value = 1;}
;
NEWLINE: ('\r')? '\n' {skip();} ;
Java代碼:
import org.antlr.runtime.*;
public class TestT {
public static void main(String[] args) throws Exception {
// Create an TLexer that feeds from that stream
//TLexer lexer = new TLexer(new ANTLRInputStream(System.in));
TLexer lexer = new TLexer(new ANTLRFileStream("input.txt"));
// Create a stream of tokens fed by the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);
// Create a parser that feeds off the token stream
TParser parser = new TParser(tokens);
// Begin parsing at rule prog
parser.prog();
}
}
輸入文件( 「input.txt中」)包含:
11111.111
1000
1000.1
Error: line 3:4 missing EOF at '.'
我第一次測試的代碼具有與前衛語句下面只有一個輸入:
prog :
binarynum EOF {System.out.println($binarynum.value);}
;
一切順利就好了,當我做上述修改的單輸入,但我似乎無法得到當使用多行輸入分隔新行時它的掛起。
有人可以幫助我,並告訴我我錯了什麼地方。
我還有另一個問題,EOF何時應該不包含在語法中?從語法中刪除EOF後,當我測試一個輸入的語法時,我沒有收到錯誤和正確的輸出。
切換到ANTLR 4可以立即解決問題。如果沒有,我很樂意回答您在針對該版本時遇到的任何問題。 –
不幸的是,我不得不使用版本3(我有一個基於編程的考試後,他的解析,antlr等相關..其中只有版本3被允許) – Ezz
@ 280Z28我可以得到一些幫助,漂亮請:/ – Ezz