2014-04-04 72 views
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後,當我測試一個輸入的語法時,我沒有收到錯誤和正確的輸出。

+0

切換到ANTLR 4可以立即解決問題。如果沒有,我很樂意回答您在針對該版本時遇到的任何問題。 –

+0

不幸的是,我不得不使用版本3(我有一個基於編程的考試後,他的解析,antlr等相關..其中只有版本3被允許) – Ezz

+0

@ 280Z28我可以得到一些幫助,漂亮請:/ – Ezz

回答

0

有人可以幫助我,告訴我我哪裏出錯了。

當您的解析器使用它們時,您的詞法分析器正在跳過換行符。從詞法分析規則中刪除{skip();}

我還有另一個問題,EOF何時應該不包含在語法中?

您通常會在頂級解析器規則的末尾使用它,這將強制解析器使用整個輸入。