Как решить еще болтаться в 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) понадобятся дальнейшие рефакторинги.