我正在尝试编写一个语法来处理二进制数并计算它们的值:
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后测试一个输入的语法时,我没有收到任何错误和正确的输出。
答案 0 :(得分:0)
有人可以帮帮我,告诉我哪里出错了。
当您的词法分析器使用它们时,您的词法分析器会跳过换行符。从词法分析器规则中删除{skip();}
。
我还有另一个问题,EOF何时不应包含在语法中?
您通常会在顶级解析器规则的末尾使用它,这会强制解析器使用整个输入。