Как решить проблему зависания еще в Coco / R?

У меня проблема с зависанием в Coco / R. Я пытаюсь понять Руководство пользователя Coco / R и я спрашиваю Google, но не могу решить проблему самостоятельно.

Я упростил свою задачу до следующей грамматики Coco / R (сохраненной в new4.atg):

COMPILER Expr 
CHARACTERS

    digit   = '0'..'9'. 
    letter  = 'A'..'Z'.

TOKENS

    number  = digit { digit }.
    name    = letter { digit | letter }.    

PRODUCTIONS

    Expr = Test | Id Test.  
    Test = Test2.   
    Test2=Id | "(" Test ")".        
    Id=IdName|IdNumber.         
    IdName = name.  
    IdNumber = number.      

END Expr.

Когда я хочу собрать компилятор с coco.bat, я получаю такой ответ:

Coco/R (Dec 22, 2014)
checking
new 4.atg(15,1): LL1 warning in Expr: number is start of several alternatives
new 4.atg(15,1): LL1 warning in Expr: name is start of several alternatives
parser + scanner generated
0 errors detected

В лучший результат в Google, я читал, что могу объявить IF(isXXXFollowYYY()) оператор, но не знаю, как и если это лучшее решение. (В моем примере: Expr = Test | If(isTestFollowID)Id Test. Но где объявлено isTestFollowID?)

Я не хочу получать предупреждения при запуске coco.bat.


person Eric    schedule 12.09.2016    source источник


Ответы (1)


Ваша грамматика неоднозначна.

Из Expr, увидев токен Id, синтаксический анализатор может перейти либо

Expr -> Test -> Test2 -> Id

or

Expr -> Id

Парсер LL (1) не будет знать, какой путь выбрать.

Непосредственную проблему можно решить, вытащив Id во вводный необязательный компонент в вашем Expr производстве:

Вместо

Expr = Test | Id Test.  

ты можешь сделать

Expr = [Id] Test . 

Однако продукция Test может также соответствовать Id в начале, поэтому кажется, что для создания грамматики LL (1) потребуются дальнейшие рефакторинги.

person 500 - Internal Server Error    schedule 12.09.2016
comment
Я проверил ваше решение. Expr = [Id] Test.. Результат тот же. (Предупреждение LL1 в Expr: число - начало и преемник удаляемой структуры) Какие дальнейшие рефакторинги потребуются? - person Eric; 13.09.2016