1

我看到答案如何让 ANTLR 3.2 在第一个错误时退出?这很有帮助。

但是,如果我的语法不正常,我似乎无法添加这些“@”规则。我的语法文件很简单:

 grammar Exp;
 options {
 output=AST;

 }

 program 
  : includes decls (procedure)*  main  -> ^(SMALLCPROGRAM includes decls (procedure)*    main) //AST - PROGRAM root
  ;

   //Lexer and Parser rules continue below as normal..tested thoroughly and works

但是,如果我尝试添加这些 @ 规则中的任何一个,我会收到以下错误:

grammar file Exp.g has no rules

和:

 Exp.g:0:1: syntax error: assign.types: org.antlr.runtime.EarlyExitException

 org\antlr\grammar\v3\DefineGrammarItemsWalker.g: node from line 202:4 required (...)+ loop did not match anything at input ';'

任何人都知道问题是什么?我只是想更改我的语法,以便当我从单独的主类运行它(使用 ANTLRStringStream 等将输入传递给它)时,当出现语法问题时,它实际上会在主类中引发错误,而不仅仅是说类似的话:

line 1:57 missing RPAREN at '{'       

在继续解析输入的其余部分之前。最终,我的主类应该拒绝解析我的语法定义的任何语法错误的输入,并且应该向用户报告错误。

4

1 回答 1

2

您可能对部分/块的顺序不正确。确保它看起来像这样:

grammar Exp;

options {
  ...
}

tokens {
  ...
}

@parser::header {
  ...
}

@lexer::header {
  ...
}

@parser::members {

  ...
}

@lexer::members {
  ...
}

我猜你在块之前放置了一个@member@header部分tokens { ... }之后tokens { ... }应该直接来。 options { ... }

我还记得某些 3.x 版本存在空白部分的问题:确保所有部分中至少有一些内容,否则忽略空白部分。

于 2013-02-13T21:06:15.297 回答