我有 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()
它时,它仅适用于解释器,而不适用于生成的代码。
谁能帮我解决我的问题?