несоответствие с синтаксическими предикатами antlr - PullRequest
1 голос
/ 03 мая 2010

В моем файле грамматики есть следующие правила лексера:

   LINE    :    'F' | 'G';
RULE    :    (('->' ('F' | 'G')) => 'F' | 'G' )
                | LINE LINE + | LINE * (ROTATE + LINE+)+ ;
fragment ROTATE    :    ('/' | '\\');

Я в основном пытаюсь сопоставить постановки, которые выглядят как F -> F / F \ F \ F / F. Он успешно соответствует вещам, подобным приведенным выше, но я предполагаю, что есть проблема с моим синтаксическим предикатом, поскольку G -> G создает исключение MismatchedTokenException. Предикат служит для устранения неоднозначности между одиночными буквами на lhs '->', которые я хочу распознать как токен LINE, и буквами на rhs, которые должны быть ПРАВИЛАМИ.

Есть идеи, что я делаю не так?

1 Ответ

1 голос
/ 03 мая 2010

Обратите внимание, что правило:

RULE
  :  (('->' ('F' | 'G')) => 'F' | 'G')
  |  LINE LINE + 
  |  LINE * (ROTATE + LINE+)+ 
  ;

соответствует одному G без предиката. Вышеуказанное правило можно переписать так:

RULE
  :  ( ('->' ('F' | 'G')) => 'F' 
     | 'G'
     )
  |  LINE LINE + 
  |  LINE * (ROTATE + LINE+)+ 
  ;

, что в свою очередь равно:

RULE
  :  ('->' ('F' | 'G')) => 'F' 
  |  'G'
  |  LINE LINE + 
  |  LINE * (ROTATE + LINE+)+ 
  ;

Возможно, вы хотели сделать что-то вроде этого:

RULE
  :  ('->' ('F' | 'G')) => ('F' | 'G')
  |  LINE LINE + 
  |  LINE * (ROTATE + LINE+)+ 
  ;
...