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我能得到一些帮助吗,请:/