【问题标题】:Handling EOF, white spaces, and new lines in ANTLR在 ANTLR 中处理 EOF、空格和新行
【发布时间】:2014-04-04 15:22:36
【问题描述】:

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

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 后测试一个输入的语法时,我没有收到任何错误和正确的输出。

【问题讨论】:

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

标签: java antlr antlr3


【解决方案1】:

谁能帮帮我,告诉我哪里出错了。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多