У меня есть язык, для которого я делаю парсер, содержащий вызовы функций. Несколько имен функций зарезервированы, и я хотел бы обрабатывать их по-другому в своем грамматике. В EBNF это будет выглядеть так
FunctionCall ::= FunctionName '(' ')'
SpecialFunctionCall :: SpecialName '(' ')'
FunctionName ::= VariableName - SpecialFunctionName
SpecialFunctionName ::= "special_function_a" | "special_function_b"
Моя проблема заключается в переводе оператора exception из EBNF в flex.
FunctionName {Letter}{LetterOrDigit}
Является супернабором SpecialFunctionName, который представляет собой жестко запрограммированную строку.
SpecialFunctionName "special_function_a" | "special_function_b"
Поэтому я получаю предупреждение от bison о том, что SpecialFunction никогда не будет сопоставлено. Должен ли я объединить токены и сравнить строки в синтаксическом анализаторе, или есть рекомендуемый способ разрешить эту двусмысленность во flex?