Разделение зарезервированных идентификаторов в flex - PullRequest
0 голосов
/ 12 ноября 2010

У меня есть язык, который я делаю парсер, для которого содержатся вызовы функций.Несколько имен функций зарезервированы, и я хотел бы обрабатывать их по-другому в моем грамматике.В EBNF это выглядело бы как

FunctionCall ::= FunctionName '(' ')'
SpecialFunctionCall :: SpecialName '(' ')'

FunctionName ::= VariableName - SpecialFunctionName

SpecialFunctionName ::= "special_function_a" | "special_function_b"

Моя проблема заключается в переводе оператора исключение из EBNF в flex.

FunctionName    {Letter}{LetterOrDigit}

Isсупер набор SpecialFunctionName , который является жестко запрограммированной строкой

SpecialFunctionName   "special_function_a" | "special_function_b"

Поэтому я получаю предупреждение от бизона о том, что SpecialFunction никогда не будет сопоставлено.Стоит ли объединять токены и сравнивать строки в синтаксическом анализаторе, или есть рекомендуемый способ устранить эту неоднозначность в flex?

Ответы [ 2 ]

3 голосов
/ 12 ноября 2010

Обычный способ справиться с этим - заставить лексический анализатор распознавать специальные имена и возвращать правильный тип токена (SpecialName) для специальных имен и токен с обычным идентификатором (очевидно, FunctionName) для других токенов.

Однако лексическому анализатору обычно требуется чрезмерная степень предвидения, чтобы сказать, что конкретное (не зарезервированное, не специальное) слово является именем функции, а не простым идентификатором (который также может быть простымпеременная - если вы не пошли по пути Perl использования сигил для идентификации переменных из функций).

0 голосов
/ 06 мая 2013

Если вы поместите правило SpecialFunction FIRST в файл лексера:

{SpecialFunctionName}    { return SpecialName; }
{FunctionName}           { return FunctionName; }

любой идентификатор, соответствующий обоим шаблонам, будет запускать первое правило и, следовательно, возвращать SpecialName вместо FunctionName.

...