看看下面的语法,就解析器生成器而言,它有一个明显的缺陷:
"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
整数还是十六进制数?!)。
在此示例中编写的产生式中,这与位无关,但可能存在语法,其中产生式的上下文将阐明是否需要整数或十六进制数,并且扫描仪仍会拒绝协作。
因此,扫描器需要知道解析器的状态,以便能够对十六进制或整数令牌做出正确的决定。
现在是术语的问题。这使这...错误...语法是什么?词法分析器?然后?一个上下文敏感的词法分析器?或者有人会说这是一种上下文相关的语法,即使它显然是一个扫描仪问题?是否有其他术语用于描述此类现象?