2012-06-20 4 views
1

У меня проблема с 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(), он работает только с интерпретатором, а не с сгенерированным кодом.

Может ли кто-нибудь помочь мне со своими проблемами?

ответ

0

user1469116 писал:

Funktion 'старт' является приватным и я должен изменить всегда публично.

Все правила по умолчанию являются частными в задаче 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().

+0

Спасибо за помощь. О, я не хочу писать токен ASSIGN. Но это все еще не работает. Только после того, как я добавлю пробел. – user1469116

+0

@ user1469116, как я уже сказал: тестируя его на Java, я не могу воспроизвести это. Вероятно, проблема связана с плагином Visual Studio или с C#-мишенью (с которой я не могу помочь). –