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