Javacc - устранение конфликта выбора с использованием левого факторинга вместо упреждающего - PullRequest
0 голосов
/ 11 ноября 2018

Я пишу программу JAVACC для простого языка, и я сталкиваюсь с 1 конфликтом, который можно исправить с помощью LOOKAHEAD (2). Смогу ли я преодолеть эту проблему, используя левосторонний код, а не внешний вид- а если нет, то почему?

Грамматика

void expression() : {}
{
    simple_expression() (addition_or_substraction() | {})
}

void simple_expression() : {}
{
    <NUMBER>
    | <LBRAC> expression() <RBRAC> 
}

void condition() : {}
{
     simple_condition() (compare_condition() | {})
} 

void prime_condition() : {}
{
    expression_comparison()
    |<NOT_OPERATOR> condition()
    | LOOKAHEAD(2) <LBRAC> condition() <RBRAC> // Choice conflict for "("
}

void expression_comparison() : {}
{
    expression()
    (   
         <EQUAL> expression()
         <LESS_THAN> expression()
         <GREATER_THAN> expression()
    )
}

void compare_condition() : {}
{
    <AND> condition() | <OR> condition()
}

1 Ответ

0 голосов
/ 15 ноября 2018

Я действительно не думаю, что вы можете оставить свой выход из проблемы. Я подозреваю (но не доказал), что язык, сгенерированный из condition, не имеет грамматики LL (1).

В любом случае, давайте попробуем левый факторинг. Давайте поработаем над более простой - но похожей - грамматикой, которая содержит основы вашей проблемы. Клеммы: number, =, [ и ].

C --> EXP = EXP  | [ C ]
EXP --> number | [ EXP ]

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

Первым шагом является расширение первого вхождения EXP в C. Не останавливайтесь, пока ваша грамматика не станет LL (1) или вы не уверены, что это бесполезное задание.

...