2016-06-18 4 views
0

Учитывая следующий ANTLR 3 грамматику:ANTLR грамматики неясность

statement1 : CHAR_KEYWORD; 
statement2 : DIGIT_KEYWORD (COLON_KEYWORD DIGIT_KEYWORD)?; 

COLON_KEYWORD : ':'; 
DIGIT_KEYWORD : '0'..'9'; 
CHAR_KEYWORD : 'a'..'z' | COLON_KEYWORD; 

При разборе следующий текст:

1 

Верховенство оператор2 подхватывает этот текст. Это хорошо. Однако, если один имеет следующий текст в настоящее время:

1:2 

Правило оператор2 не подхватить этот текст и выдает ошибку. Это происходит потому, что «:» соответствует CHAR_KEYWORD, который не является частью правила. Если удалять COLON_KEYWORD из CHAR_KEYWORD, правило statement2 работает отлично, за исключением того, что правило statement1 не работает должным образом. Как можно реорганизовать эту грамматику так, чтобы оба правила statement1 и statement2 работали должным образом? Благодаря!

ответ

0

Удалите COLON_KEYWORD alt из CHAR_KEYWORD и вместо этого добавьте его как alt в statement1.

statement1 : CHAR_KEYWORD | COLON_KEYWORD; 
statement2 : DIGIT_KEYWORD (COLON_KEYWORD DIGIT_KEYWORD)?; 

COLON_KEYWORD : ':'; 
DIGIT_KEYWORD : '0'..'9'; 
CHAR_KEYWORD : 'a'..'z';