パーサージェネレータに関する限り、明らかな欠陥がある次の文法を見ると:
"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
整数か 16 進数か?!)。
この例で記述されたプロダクションでは、これはビットとは無関係になりますが、プロダクションのコンテキストが整数または 16 進数のどちらが期待されているかを明確にし、スキャナが依然として連携を拒否する文法が存在する可能性があります。
したがって、スキャナーは、16 進トークンまたは整数トークンに関して正しい判断を下すために、パーサーの状態を知る必要があります。
さて、用語の問題です。これは何を意味しているのでしょうか? うーん... 文法ですか? レクサー?それから?文脈依存のレクサー?それとも、明らかにスキャナーの問題であるにもかかわらず、これは文脈依存の文法であると言えるでしょうか? そのような現象を説明するために使用される他の用語はありますか?