У меня проблема с 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#, у меня есть несколько ошибок: Функция «start» является частной, и я должен постоянно меняться. Кроме того, когда я изменить общественности и будет анализировать follwing:
ROOT_base ct_s {
scope=aliejfoac;
}
Internaly происходит NoViableAltException. Если я добавляю пробел после точки с запятой, он работает правильно. Но я вижу только исключение в режиме Debbug с помощью Visual Studio.
Еще одна проблема, с которой я столкнулся, что ошибки синтаксиса не отображаются. Я добавил:
catch [RecognitionException re] {
ReportError(re);
throw new Exception(re.ToString() + "\non line " + re.Line + " and row " + re.CharPositionInLine.ToString());
}
Теперь при возникновении синтаксической ошибки будет отображаться исключение.
И наконец, у меня есть проблема с Skip()
. Когда я пишу его Skip()
, он работает с сгенерированным кодом, а не с интерпретатором. Когда я пишу skip()
, он работает только с интерпретатором, а не с сгенерированным кодом.
Может ли кто-нибудь помочь мне со своими проблемами?
Спасибо за помощь. О, я не хочу писать токен ASSIGN. Но это все еще не работает. Только после того, как я добавлю пробел. – user1469116
@ user1469116, как я уже сказал: тестируя его на Java, я не могу воспроизвести это. Вероятно, проблема связана с плагином Visual Studio или с C#-мишенью (с которой я не могу помочь). –