我是ANTLR的新手。我不觉得我的语法有任何问题,但是当我运行解析树时,ANTLR给了我mismatched input
消息。谁能帮我解释一下为什么会这样?
这是我的lexer
lexer grammar SynthtaxLexer;
FUN : 'fun' ;
ID : [a-zA-Z_]+ ;
COMMA : ',';
OPENPAREN : '(';
CLOSEPAREN : ')';
OPENBRACKET : '{';
CLOSEBRACKET : '}';
NEWLINE: ('\r' '\n'? | '\n') -> skip;
WS : [ \t]+ -> skip;
下面是我的解析器
parser grammar SynthtaxParser;
prog : function+ EOF;
function : funcDeclaration OPENBRACKET CLOSEBRACKET;
funcDeclaration : FUN ID OPENPAREN formalParameters? CLOSEPAREN;
formalParameters : ID (COMMA ID)*;
下面是我如何运行它
#include <iostream>
#include <fstream>
#include "antlr4-runtime.h"
#include "libs/SynthtaxLexer.h"
#include "libs/SynthtaxParser.h"
using namespace antlr4;
int main(int argc, const char *argv[]) {
std::ifstream stream;
stream.open("../test/mini.in");
ANTLRInputStream input(stream);
synthtax_antlr::SynthtaxLexer lexer(&input);
CommonTokenStream tokens(&lexer);
tokens.fill();
for (auto token : tokens.getTokens()) {
std::cout << token->toString() << '\n';
}
synthtax_antlr::SynthtaxParser parser(&tokens);
tree::ParseTree *tree = parser.prog();
std::cout << tree->toStringTree(&parser) << '\n';
return 0;
}
这里是输入
fun myfunction () {}
这是输出
[@0,0:2='fun',<1>,1:0]
[@1,4:13='myfunction',<2>,1:4]
[@2,15:15='(',<4>,1:15]
[@3,16:16=')',<5>,1:16]
[@4,18:18='{',<6>,1:18]
[@5,19:19='}',<7>,1:19]
[@6,21:20='<EOF>',<-1>,2:0]
line 1:0 mismatched input 'fun' expecting FUN
(prog fun myfunction ( ) { })
我试着用我原来的语法的这个迷你版来解决这个问题,但还是没有运气
2条答案
按热度按时间fwzugrvs1#
输入
fun myfunction () {}
解析得很好:也许令牌流已经被消耗了,因为你把它们打印到了stdout。试试这个:
如果这不起作用,请确保您最近从语法生成了词法分析器和解析器类。
我尝试了以下Java代码:
它打印:
b1payxdu2#
看起来
mismatched input
至少不会影响语法的正确性,所以我修复它的方法是在main.cpp中使用MyErrorStrategy
忽略它。