2013-04-15 3 views
1

Я использую ANTLR для создания распознавателя для Java-подобного языка и используется следующие правила распознавать общие типы:жизнеспособной альтернативы ошибки

referenceType 
: singleType ('.' singleType)* 
; 

singleType 
: Identifier typeArguments? 
; 

typeArguments 
: '<' typeArgument (',' typeArgument)* '>' 
; 

typeArgument 
: referenceType 
; 

Теперь для следующего входного заявления, ANTLR не производит «нет жизнеспособной альтернативной» ошибки.

Iterator<Entry<K,V>> i = entrySet().iterator(); 

Однако, если я помещаю пробел между двумя последовательными символами '>', ошибок не возникает. Это говорит о том, что ANTLR не может отличить вышеуказанное правило от правила, используемого для распознавания сдвиговых выражений, но я не знаю, как изменить грамматику, чтобы устранить эту двусмысленность. Любая помощь будет оценена по достоинству.

ответ

1

Вы, вероятно, есть правило, как следующее в лексере:

RightShift : '>>'; 

Для ANTLR признать >> либо как два > символов или один >> оператора, в зависимости от контекста, вы должны будете поместить эту оператор сдвиг в парсер:

rightShift : '>' '>'; 

Если ваш язык включает >>> или >>= операторов, те должны были бы быть перемещены в синтаксический анализатор, а также.

Для подтверждения того, что x > > y не допускается, вы хотите, чтобы сделать проход над результатом синтаксического дерева (ANTLR 4) или AST (ANTLR 3), чтобы убедиться, что два > символов разобранные по правилу rightShift парсера появляются в последовательности.

-1

280Z28, вероятно, прав в своем диагнозе, что у вас есть правило, как

RightShift : '>>'; 

Альтернативным решением является явно включить возможность завершающего >> в вашем парсер. (Я видел это в других грамматик, но только в LALR.)

typeArguments 
: ('<' typeArgument (',' typeArgument)* '>') | 
    ('<' typeArgument ',' referenceType '<' typeArgument RightShift); 

; 

В Antlr3, что необходимо будет слева учитываться.

Является ли это более четким или имеет второй проход, который проверяет ваш оператор смены вправо, зависит от того, как часто вам нужно это использовать.

Смежные вопросы