Antlr4 解析编号失败



我正在尝试使用 antlr4 解析数字(双精度和整数(,但失败了。希望有人能帮助我。

我的测试代码是:

public class TestAntlr4 {
@Test
public void test() throws IOException {
String input = "30";
CharStream inputCharStream = new ANTLRInputStream(new StringReader(input));
// create a lexer that feeds off of input CharStream
TokenSource tokenSource = new GqlLexer(inputCharStream);
// create a buffer of tokens pulled from the lexer
TokenStream inputTokenStream = new CommonTokenStream(tokenSource);
// create a parser that feeds off the tokens buffer
TestAntlr4Parser parser = new TestAntlr4Parser(inputTokenStream);
parser.removeErrorListeners(); // remove ConsoleErrorListener
parser.addErrorListener(new VerboseListener());
parser.getInterpreter().setPredictionMode(PredictionMode.LL_EXACT_AMBIG_DETECTION);
NumberContext context = parser.number();
System.out.println(context.toString());
}
}

我的antlr4语法是:

grammar TestAntlr4 ;

number
: INT_NUMBER
| DOUBLE_NUMBER ;
DOUBLE_NUMBER
: ('+'|'-')? INTEGER '.' INTEGER? ;
INT_NUMBER
: ('+'|'-')? INTEGER ;
WS
: [ trn]+ -> skip ; // skip spaces, tabs, newlines
fragment INTEGER
: '0'
| '1'..'9' ('0'..'9')* ;
fragment DIGIT
: [0-9] ;

结果是:

rule stack: [number]
line 1:0 at [@0,0:1='30',<31>,1:0]: mismatched input '30' expecting {DOUBLE_NUMBER, INT_NUMBER}
[]

谁能告诉我这有什么问题?

语法似乎还可以。 使用输入"30"对我来说,lexes 和解析很好:

[@0,0:1='30',<INT_NUMBER>,1:0]
[@1,2:1='<EOF>',<EOF>,1:2]

也尝试过双打:

[@0,0:6='30.3343',<DOUBLE_NUMBER>,1:0]
[@1,7:6='<EOF>',<EOF>,1:7]

解析得很好。

现在,在我的环境中,我使用的是 C# 目标,所以我的代码与您的代码略有不同。

使用访问者模式的我的 (C#( 代码:

AntlrInputStream inputStream = new AntlrInputStream(stream);
Grammar1Lexer lexer = new Grammar1Lexer(inputStream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
Grammar1Parser parser = new Grammar1Parser(tokenStream);
IParseTree tree = parser.number(); 
Grammar1Visitor visitor = new Grammar1Visitor();
visitor.Visit(tree);

编译和工作正常。

更新:

我注意到您的词法器和解析器的名称不同,您会有一个简单的复制/粘贴错误吗? 通常,当您生成类时,所有类都根据您的语法名称统一命名。

相关内容

  • 没有找到相关文章

最新更新