ANTLR4 中的输入不匹配

问题描述 投票:0回答:2

我是 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 ( ) { })

我尝试用我原来的语法的这个迷你版解决问题,但仍然没有运气

c++ compiler-construction antlr antlr4 grammar
2个回答
0
投票

输入

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>)

0
投票

看起来

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';
}
© www.soinside.com 2019 - 2024. All rights reserved.