2013-09-09 1 views
0

У меня есть простая лексер/грамматика, над которой я работал, и мне сложно понять стандартную операционную процедуру для сопоставления форматированных переменных. Я пытаюсь соответствовать следующим:Захват форматированных объявлений переменных в ANTLR

  1. Имя переменной может быть не менее 1 символа. Если это один символ, это должна быть прописная или строчная буква.
  2. Если оно больше 1 символа, оно должно начинаться с буквы любого случая, а затем следует любое количество символов, включая цифры, знак подчеркивания и знак доллара.

Я переписан несколько раз, во многих разновидностях, и я всегда получаю следующее сообщение об ошибке:

Decision can match input such as "SINGLELETTER" using multiple alternatives: 1, 2

As a result, alternative(s) 2 were disabled for that input"

бы реально оценить некоторое представление. Я понимаю, что в моей грамматике есть некоторая двусмысленность, но я немного смущен, почему несколько альтернатив могут быть сопоставлены, когда мы вводим исходный цикл соответствия. Спасибо!

variablename 
    : (SINGLELETTER) 
    | (SINGLELETTER|UNDERSCORE)(SINGLELETTER|UNDERSCORE | DOLLAR | NUMBER)*; 

SINGLELETTER : ('a'..'z' | 'A'..'Z'); 


fragment LOWERCASE : 'a'..'z'; 
fragment UNDERSCORE : '_'; 
fragment DOLLAR : '$'; 
fragment NUMBER : '0'..'9'; 

ответ

0

Почему бы не сделать VariableName, правило лексического, который производит один маркер для полного имени?

Variablename 
    : SINGLELETTER 
    | (SINGLELETTER|UNDERSCORE) (SINGLELETTER | UNDERSCORE | DOLLAR | NUMBER)*; 

fragment SINGLELETTER : ('a'..'z' | 'A'..'Z'); 


fragment LOWERCASE : 'a'..'z'; 
fragment UNDERSCORE : '_'; 
fragment DOLLAR : '$'; 
fragment NUMBER : '0'..'9'; 

Кроме того, как вы написали variableName не следует точка № 2 вы написали (грамматика позволяет переменной начать с _, но не допустить, чтобы в ваше объяснение).

+0

Благодарим вас за ответ. Однако эти два правила, похоже, соответствуют тому же самому, что я написал, кроме одного - лексер, а одно - правило парсера. «Решение может соответствовать вводу, например« {'A' .. 'Z', 'a' .. 'z'} ", используя несколько альтернатив: 1, 2 В результате альтернативы (2) были отключены для этого вход» –