2016-09-07 8 views
0

Здравствуйте, я не понимаю, почему существует конфликт в производстве assgnStmt. Я использую coco/R, и я получаю «предупреждение LL1 в assgnStmt: ID запускает & преемника удаляемой структуры». Спасибо.грамматика LL (1) конфликты

COMPILER program 

CHARACTERS 
Letter= 'a'..'z'. 
Digit= '0'..'9'. 

TOKENS 
NUM= Digit {Digit}. 
ID= Letter {Letter}. 

PRODUCTIONS 
program 
    = stmts 
    . 
    stmts = assgnStmt { assgnStmt ';' } . 

    assgnStmt 
    = {ID "==" } expr 
    . 
    expr = term { ('+' | '-') term } . 

    term = factor { ('*' | '/' ) factor } . 

    factor 
    = '(' expr ')' 
    | ID 
    | NUM 
    . 
    END program. 

ответ

0

{ID "=="} является «файлом удаляемой структуры», которая представляет собой способ сказать, что это не является обязательным. Он может начинаться с ID, очевидно. Но expr также может начинаться с ID, а если {ID "=="} нет, то анализатор должен попытаться распознать expr.

Анализаторы LL всегда должны знать, какую продукцию они пытаются распознать. Но когда синтаксический анализатор встречает ID в этом контексте, он не может определить, следует ли ожидать {ID "=="} или expr.

Это сообщение об ошибке. Крепление это сложнее, хотя и не невозможно. Вы можете начать с чего-то вроде ID {"==" ID} rest-of-expr, но это только распознает некоторые назначения (именно те, где expr действительно начинается с ID).

(Это пример того, почему я не нашел генераторы парсеров LL (1) очень удовлетворительными. У анализатора LR (1) не было бы проблем с этим синтаксисом. Поэтому я не знаю достаточно о Coco/R чтобы дать больше предложений.)

+0

Я добавил , что является более общим, оставляя семантический анализ правильной работы. – blob

+0

Да, я должен был упомянуть этот вариант. Во всяком случае, я надеюсь, что ответ немного помог. – rici