解析时出现ANTLR错误

时间:2012-06-20 12:01:38

标签: parsing compiler-construction antlr

我有一个antlr的问题。 我有以下简单的语法:

grammar bxk; 
options
{
    language=CSharp3;
}

// start rule
start
    : root* EOF
    ;


root
    : ROOT_ID CT_ID ((rd=rootDefinition) | END)
    ;


rootDefinition  
    : '{'
      ('scope' ASSIGN s=STRING END)?
      ('major' ASSIGN i=STRING END)?
      ('minor' ASSIGN i=STRING END)?
      ('revision' ASSIGN i=STRING END)?
      '}'
    ;   

CHAR    :  ('a'..'z'|'A'..'Z') ;
ROOT_ID :  'ROOT_'(CHAR | DIGIT | SPECIAL)+ ;
CT_ID   :  'ct_'(CHAR | DIGIT | SPECIAL)+ ;
DIGIT   :  '0'..'9';
SPECIAL :  '_' ;
END :  ';';
STRING  :  CHAR (CHAR | DIGIT | SPECIAL)*;
WS      :  (' '|'\t' | '\n' | '\r' | '\u000C')+ {Skip();} ; 

就是这样。现在,当我生成c#代码时,我有几个错误: 功能'开始'是私人的,我必须永远改变为公共。 此外,当我改为公开并将解析以下内容时:

ROOT_base ct_s { 
 scope=aliejfoac;
}

Internaly发生NoViableAltException。 如果我在分号后添加一个空格它运行正常。但我只能在Visual Studio中看到Debbug模式中的异常。

我遇到的另一个问题是合成错误不会显示。我补充说:

catch [RecognitionException re] {
    ReportError(re);
    throw new Exception(re.ToString() + "\non line " + re.Line + " and row " + re.CharPositionInLine.ToString());
}

现在,如果发生语法错误,将显示异常。

最后我遇到Skip()的问题。当我写它Skip()时,它适用于生成的代码,而不是解释器。当我写skip()时,它只适用于解释器,而不适用于生成的代码。

任何人都可以帮我解决问题吗?

1 个答案:

答案 0 :(得分:0)

  

user1469116写道:

     

功能'开始'是私人的,我必须永远改变为公开。

默认情况下,C#目标中的所有规则都是私有的。通过在您的入口点规则前添加关键字public来明确地公开它:

public start
 : root* EOF
 ;
  

user1469116写道:

     

Internaly发生NoViableAltException。如果我在分号后添加一个空格,它就能正常运行。

如果我添加规则:

ASSIGN :  '=';

我可以成功解析您的输入。 ANTLRWorks的调试器按如下方式解析它:

enter image description here

  

user1469116写道:

     

最后我遇到了Skip()的问题。当我写它Skip()时,它使用生成的代码而不是解释器。当我写skip()时,它只适用于解释器,而不适用于生成的代码。

解释器(我假设来自ANTLRWorks)忽略了语法选项部分内的所有内容,并且基于Java。并且Java目标只“知道”skip(),而C#目标只“知道”Skip()方法。

相关问题