1

我有 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# 代码时,我遇到了几个错误: funktion 'start' 是私有的,我必须始终更改为 public。此外,当我更改为 public 并将解析以下内容时:

ROOT_base ct_s { 
 scope=aliejfoac;
}

在内部发生 NoViableAltException。如果我在分号后添加一个空格,它会正常运行。但我只能在 Visual Studio 的调试模式下看到异常。

我遇到的另一个问题是语法错误不显示。我已经添加:

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

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

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

谁能帮我解决我的问题?

4

1 回答 1

0

用户 1469116 写道:

功能“开始”是私有的,我必须始终更改为公开。

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

public start
 : root* EOF
 ;

用户 1469116 写道:

在内部发生 NoViableAltException。如果我在分号后添加一个空格,它会正常运行。

如果我添加规则:

ASSIGN :  '=';

我可以成功解析您的输入。ANTLRWorks 的调试器将其解析如下:

在此处输入图像描述

用户 1469116 写道:

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

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

于 2012-06-20T18:13:11.837 回答