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

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

Я упростил мою задачу до следующей грамматики Коко / 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,

1 ответ

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

От Exprувидев Id маркер, парсер может идти либо

Expr -> Test -> Test2 -> Id

или же

Expr -> Id

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

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

Вместо

Expr = Test | Id Test.  

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

Expr = [Id] Test . 

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

Другие вопросы по тегам