Java 在ANTLR中处理EOF、空格和新行

Java 在ANTLR中处理EOF、空格和新行,java,antlr,antlr3,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 [doub

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

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
错误:第3:4行“.”处缺少EOF。

我首先测试了代码,使用prog语句只进行了一次输入,如下所示:

    prog : 
        binarynum EOF {System.out.println($binarynum.value);}
         ;
当我用一个输入进行上述修改时,一切都很好,但是当使用多个由新行分隔的输入时,我似乎无法掌握它的窍门

谁能帮我一下,告诉我哪里出了问题

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

谁能帮我一下,告诉我哪里出了问题

当解析器使用换行符时,lexer正在跳过换行符。从lexer规则中删除
{skip();}

我还有另一个问题,什么时候EOF不应该包含在语法中


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

切换到ANTLR 4可以立即解决问题。如果没有,我很乐意回答您在针对该版本时遇到的任何问题。不幸的是,我必须使用版本3(稍后我有一个基于编程的考试,其中his与解析、antlr等相关,其中只允许使用版本3)@280Z28我能得到一些帮助吗,请:/