Глядя на следующую грамматику, которая имеет очевидный недостаток в отношении генераторов синтаксических анализаторов:
"Start Symbol" = <Foo>
"Case Sensitive" = True
"Character Mapping" = 'Unicode'
{A} = {Digit}
{B} = [abcdefABCDEF]
{C} = {A} + {B}
Integer = {A}+
HexNumber = {C}+
<ContextA> ::= '[' HexNumber ']'
<ContextB> ::= '{' Integer '}'
<Number> ::= <ContextA> | <ContextB>
<Foo> ::= <Number> <Foo>
| <>
Причина, по которой эта грамматика ошибочна, заключается в том, что сканер не может различить терминалы [Integer;HexNumber]
. (Является ли 1234
целым или шестнадцатеричным числом?!).
В продуктах, написанных в этом примере, это становится неактуальным для битов, но могут быть грамматики, где контекст продуктов уточняет, ожидается ли целое или шестнадцатеричное число, и сканер все равно отказывается сотрудничать.
Таким образом, сканеру необходимо знать состояние синтаксического анализатора, чтобы иметь возможность принять правильное решение относительно шестнадцатеричного или целочисленного токена.
Теперь вопрос по терминологии. Что это делает с этой... эээ... грамматикой? Лексер? тогда? Контекстно-зависимый лексер? Или можно сказать, что это контекстно-зависимая грамматика, хотя это явно проблема сканера? Используются ли другие термины для описания таких явлений?