我有一个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()
时,它只适用于解释器,而不适用于生成的代码。
任何人都可以帮我解决问题吗?
答案 0 :(得分:0)
user1469116写道:
功能'开始'是私人的,我必须永远改变为公开。
默认情况下,C#目标中的所有规则都是私有的。通过在您的入口点规则前添加关键字public
来明确地公开它:
public start
: root* EOF
;
user1469116写道:
Internaly发生NoViableAltException。如果我在分号后添加一个空格,它就能正常运行。
如果我添加规则:
ASSIGN : '=';
我可以成功解析您的输入。 ANTLRWorks的调试器按如下方式解析它:
user1469116写道:
最后我遇到了Skip()的问题。当我写它Skip()时,它使用生成的代码而不是解释器。当我写skip()时,它只适用于解释器,而不适用于生成的代码。
解释器(我假设来自ANTLRWorks)忽略了语法选项部分内的所有内容,并且基于Java。并且Java目标只“知道”skip()
,而C#目标只“知道”Skip()
方法。