2016-04-14 3 views
1

В следующей грамматике:Предотвращение неясной неоднозначности в грамматике

expr : r1 EOF 
    | r2 EOF 
    ; 

r1 : '1' L1 'x' ; 
r2 : '1' L2 'y' ; 

L1: 'a' ; 
L2: 'a' ; 

Когда я разбор выражения

1ay 

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

line 1:2 mismatched input 'y' expecting 'x'

Почему он не может быть правильно разобран? Могу ли я дать ему директивы для этого?

Синтаксический код:

private static void parse(String str) 
{ 
    ANTLRInputStream input = new ANTLRInputStream(str); 
    AmbLexer lexer = new AmbLexer(input); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    AmbParser parser = new AmbParser(tokens); 
    ParseTree tree = parser.expr(); 
    System.err.println(tree.toStringTree(parser)); 
} 

ответ

2

Первый шаг в разборе создает маркер потока, основанный на правилах LeXeR. Токен создается с правилом, которое будет сначала совпадать. Поэтому в вашем случае каждый «a» будет L1. И поскольку r1 - это только правило парсера, содержащее L1, оно не может соответствовать вводу, потому что правило 'r1' ожидает 'x', а не 'y'.

Поэтому правила lexer должны быть заказаны, поэтому специальные и более конкретные будут более неопределенными. Правила в виде строки, числа будут в конце, но правила как «func», «class» будут перед ними.

Чтобы решить эту проблему, объедините L1 и L2 в одно правило и используйте его в обоих правилах анализа.

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