Я пытаюсь разобрать контекстно-свободный язык, называемый Context Free Art .Я создал его синтаксический анализатор в Javascript с использованием YACC-подобного генератора синтаксических анализаторов JS LALR (1) JSCC .
. Возьмите пример следующего кода CFA (Context Free Art).Этот код является действительным CFA.
startshape A
rule A { CIRCLE { s 1} }
Обратите внимание на A
и s
выше.s
- это команда для масштабирования CIRCLE
, но A
- это просто имя этого правила.В грамматике языка я установил s
как токен SCALE
, а A
подпадает под токен STRING
(у меня есть регулярное выражение для соответствия строке, и оно находится внизу всех токенов).
Это работает нормально, но в приведенном ниже случае оно ломается.
startshape s
rule s { CIRCLE { s 1} }
Это тоже совершенно корректный код, но так как мой анализатор помечает s
после rule
как SCALE
токен, так чтоиз-за ошибок, говорящих, что он ожидал STRING
.
Теперь мой вопрос: есть ли способ переписать правила производства парсера, чтобы учесть это?Связанное производственное правило: -
rule:
RULE STRING '{' buncha_replacements '}' [* rule(%2, 1) *]
|
RULE STRING RATIONAL '{' buncha_replacements '}' [* rule(%2, 1*%3) *]
;
Одно простое решение, о котором я могу подумать, - это создать копию вышеуказанного правила с заменой STRING
на SCALE
, но это только одно из многих похожих правилкоторый бы нуждался в такой фиксации.Кроме того, есть много других терминалов, которые могут быть согласованы с STRING
.Так что это значит слишком много правил!