У меня есть проблема с EBNF грамматикой в ANTLRWorks:EBNF грамматика (ANTLR)
line 37:
upper_lower_case
: LOWER_CASE
| UPPER_CASE
;
line 42:
CLASSNAME
: UPPER_CASE (DIGITS | upper_lower_case)*
;
line 51:
UPPER_CASE
: 'A'..'Z'
;
line 55:
LOWER_CASE
: 'a'..'z'
;
line 60:
DIGITS : '0'..'9'
;
Я хочу Classname всегда начинать с заглавной буквой, а чем она может состоять из цифр, верхних и строчных букв ,
Журнал ошибок:
[13:11:59] warning(200): classgenerator.g:43:42:
Decision can match input such as "'0'..'9'" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
[13:11:59] warning(200): classgenerator.g:43:42:
Decision can match input such as "<EOT>" using multiple alternatives: 2, 3
As a result, alternative(s) 3 were disabled for that input
[13:11:59] error(201): classgenerator.g:43:42: The following alternatives can never be
matched: 3
[13:11:59] error(208): classgenerator.g:60:1: The following token definitions can never
be matched because prior tokens match the same input: UPPER_CASE,DIGITS
Может кто-нибудь помочь мне решить эту проблему? Спасибо заранее.
С уважением, Hladeo
EDIT:
Так что я должен использовать фрагмент ключевое слово, если оно не относится к лексем? Таким образом, использование ключевого слова фрагмента будет неправильным?
tokens {
PUBLIC = '+';
PRIVATE = '-';
PROTECTED = '=';
}
fragment ACCESSOR
: PUBLIC
| PRIVATE
| PROTECTED
;
и другой вопрос.
OBJECTNAME
: UPPER_LOWER_CASE (UPPER_LOWER_CASE | DIGIT)*
;
OBJECTNAME должен состоять, по меньшей мере, одной буквы (верхний или нижний регистр не имеет значения) и, возможно, из других букв или цифр - то, что случилось с этой частью коды? Когда я пытаюсь ввести, например variable
- это нормально, но когда я начинаю с заглавной буквой Variable
я получаю сообщение об ошибке:
line 1:15 mismatched input 'Variable' expecting OBJECTNAME
Спасибо за ответ. Не могли бы вы ответить на мои новые вопросы? Я отредактировал первый пост. – Hladeo
Так есть ли возможность отличить CLASSNAME и OBJECTNAME? Я пишу простой генератор классов Java, где я мог бы ввести: 'create ClassName + name: String, -age: int;' где variable, age, String и int являются объектами OBJECTNAME. – Hladeo
@Hladeo См. Редактирование 2 в моем ответе :) –