我是 ANTLR 的新手。我没有发现我的语法有任何问题,但是当我运行解析树时,ANTLR 给了我
mismatched input
消息。谁能帮我解释一下为什么我会这样?
这是我的词法分析器
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 ( ) { })
我尝试用我原来的语法的这个迷你版解决问题,但仍然没有运气
输入
fun myfunction () {}
被解析得很好:
也许令牌流已经被消耗,因为你将它们打印到标准输出。试试这个:
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;
}
如果这不起作用,请确保您最近从语法中生成了词法分析器和解析器类。
我尝试了以下Java代码:
public class Main {
public static void main(String[] args) {
var lexer = new SynthtaxLexer(CharStreams.fromString("fun myfunction () {}"));
var parser = new SynthtaxParser(new CommonTokenStream(lexer));
var root = parser.prog();
System.out.println(root.toStringTree(parser));
}
}
打印:
(prog (function (funcDeclaration fun myfunction ( )) { }) <EOF>)
看起来
mismatched input
至少不会影响我语法的正确性。所以我修复它的方法是在 main.cpp中用
MyErrorStrategy
忽略它
#include "antlr4-runtime.h"
// other includes ...
using namespace antlr4;
class MyErrorStrategy : public DefaultErrorStrategy {
public:
virtual void reportInputMismatch(Parser *recognizer, const InputMismatchException &e) {
// Do nothing to ignore input mismatch errors
}
};
int main(int argc, const char *argv[]) {
// ...
synthtax_antlr::SynthtaxParser parser(&tokens);
parser.setErrorHandler(std::make_shared<MyErrorStrategy>());
tree::ParseTree *tree = parser.prog();
std::cout << tree->toStringTree(&parser) << '\n';
}