Нужна помощь в отношении одного LALR (1) анализа - PullRequest
2 голосов
/ 23 июня 2011

Я пытаюсь разобрать контекстно-свободный язык, называемый 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.Так что это значит слишком много правил!

1 Ответ

0 голосов
/ 23 июня 2011

Да!Наконец решение моей проблемы ударило меня.Все, что мне нужно сделать, это изменить вышеприведенное производство так: -

rule:
    RULE user_string '{' buncha_replacements '}'    [* rule(%2, 1) *]
    |
    RULE user_string RATIONAL '{' buncha_replacements '}'  [* rule(%2, 1*%3) *]
    ;

user_string:
    STRING | SCALE ;

Это довольно элегантное решение по сравнению с тем, что я упоминал в своем тексте проблемы.Если у кого-то есть лучшее решение, тогда, пожалуйста, оставьте комментарий.

...