【发布时间】: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 我能得到一些帮助吗,非常感谢:/