处理ANTLR中的EOF,空格和新行

时间:2014-04-04 15:22:36

标签: java antlr antlr3

我正在尝试编写一个语法来处理二进制数并计算它们的值:

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语句输入一个输入来测试代码,如下所示:

    prog : 
        binarynum EOF {System.out.println($binarynum.value);}
         ;

当我使用一个输入进行上述修改时,一切正常,但是当使用由新行分隔的多个输入时,我似乎无法理解它。

有人可以帮帮我,告诉我哪里出错了。

我还有另一个问题,EOF何时不应包含在语法中?当我从语法中删除EOF后测试一个输入的语法时,我没有收到任何错误和正确的输出。

1 个答案:

答案 0 :(得分:0)

  

有人可以帮帮我,告诉我哪里出错了。

当您的词法分析器使用它们时,您的词法分析器会跳过换行符。从词法分析器规则中删除{skip();}

  

我还有另一个问题,EOF何时不应包含在语法中?

您通常会在顶级解析器规则的末尾使用它,这会强制解析器使用整个输入。