看下面的语法,就解析器生成器而言,它有一个明显的缺陷:

"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是整数还是十六进制数字?!)。

在此示例中编写的产品中,这与位无关,但是可能存在语法,其中产品的上下文将阐明是否期望整数或十六进制数,并且扫描程序仍将拒绝协作。

因此,扫描程序将需要知道解析器状态,以便能够针对十六进制或整数令牌做出正确的决定。

现在是术语的问题。 这是什么使……错误……语法? 词法? 然后? 上下文敏感的词法分析器? 还是会说这是上下文相关的语法,即使它显然是扫描仪问题? 还有其他用于描述此类现象的术语吗?

===============>>#1 票数:2

上下文敏感意味着完全不同。

如果您使用更正式的符号,则会发现您的原始语法是模棱两可的,正如Ignacio Vazquez-Abrams所说的那样,并且您可以通过LR(1)(甚至LL(1))很好地处理编辑后的语法。解析器生成器。 这是一个毫无问题的野牛语法:

%start number
%%
digit : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
hex   : digit
      | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' 
      | 'A' | 'B' | 'C' | 'D' | 'E' | 'F'
decnum: digit | decnum digit
hexnum: hex   | hexnum hex
number: '[' decnum ']'
      | '{' hexnum '}'

当然,通常不使用野牛来创建扫描仪,但是肯定可以。

我认为您正在考虑的问题是这样的:如果我们使用flex构建扫描仪,它将看起来像这样:

[[:digit:]]+  { yylval.string = strdup(yytext); return DECNUM; }
[[:xdigit:]]+ { yylval.string = strdup(yytext); return HEXNUM; }

Flex不能返回模糊的令牌,因此,在(下一部分)输入为1234 ,Flex需要返回DECNUM或HEXNUM。 第一条最长的规则(“最大嚼数”)意味着,在令牌中可以采用任何一种方式进行解析的情况下,flex定义中最先出现的模式将获胜。 这意味着需要首先使用DECNUM模式,因为否则它将无法触发(在这种情况下,flex将提供警告)。

但是现在语法有一个小问题,因为当语法期望一个HEXNUM时,就需要准备查找DECNUM。 只要语法是明确的 ,那不是问题。 我们只需要创建几个非终端:

decnum: DECNUM           { $$ = strtol($1, NULL, 10); free($1); }
hexnum: DECNUM | HEXNUM  { $$ = strtol($1, NULL, 16); free($1); }

这不会产生歧义,甚至不会产生语法中尚不存在的移位/减少冲突。

如果要尝试此操作,则需要在野牛序言中声明一些类型:

%union {
   char* string;
   long  integer;
}
%token <string> HEXNUM DECNUM
%type <integer> hexnum decnum

===============>>#2 票数:0

这种语法可谓是模棱两可的

  ask by BitTickler translate from so

未解决问题?本站智能推荐:

1回复

用于描述组合词法分析器和解析器的术语是什么?

据我了解:词法分析器(词法分析器)将字符序列转换为令牌序列,而解析器(语法分析器)通常将令牌序列转换为解析树。 由于这些操作通常是按顺序使用的,是否有一个明确的单字术语来描述这一点? 还是解析也可以同时指代词法分析和语法分析?
2回复

术语“句法形式”的定义

本杰明·皮尔斯(Benjamin C. Pierce)在“类型和编程语言”一书中使用了概念/术语syntactic form (参见图片),但是他没有对此给出明确的定义。 我试图在Internet上查找该术语的定义,但没有发现任何启示。 有人可以指出一些定义了该术语的参考书吗? 语
1回复

立即引用的正确术语是什么?

这是一个极端的菜鸟问题。 Google很难,因为我不知道它是什么。 ;) 我正在寻找用于立即引用数据的术语。 JavaScript支持此功能,Perl和许多其他功能也支持。 在JS中,您可以这样做: 在PHP中,您必须这样做: 这种立即引用语法的正确术语是什么?
3回复

在线资金转账服务的正确术语是什么?

诸如PayPal,NETeller,Click2Pay,Moneybookers等服务?
2回复

以下函数式编程模式的正确术语是什么?

我听说它被称为流 ,作为一个无限的列表 ,有时甚至作为一个懒惰的序列 。 以下模式的正确用语是什么? (显示的Clojure代码)
4回复

URL无查询参数的正确术语是什么?

假设您有以下网址: http://example.com/path?param=value “ param = value”是查询字符串“ / path”是路径“ http://”是协议 仅“ http://example.com/path ”的专有名称是什么? 谢谢!
3回复

初始化数据成员的列表的正确术语是什么?

一位同事说初始化列表 ,另一个初始化列表 。 一个SO 答案说初始化列表 ,另一个初始化列表 。 哪个是正确的*术语? PS:他们都谈论数据成员初始化/列表。 *如果对您不正确,您可以回退到标准使用的术语。
2回复

这种CSS声明“.myClass div”的正确术语是什么?

引用包含CSS组合器的CSS声明时,正确的术语是什么,例如: 在这里,我使用一个声明,它将样式应用于具有类myClass元素内的所有div元素。 但这无关紧要。 我有兴趣了解提及父选择器的声明的正确术语。 但是这种宣言的正确术语是什么?
1回复

XML元素的正确术语是什么?

我正在开发一个SOAP应用程序,由于它基本上使用XML作为数据容器,所以我对XML元素的正确术语感到好奇。 例如,我们有标题,正文,信封,但是soap操作被称为什么? 我特别想知道<something_something>字段是什么? 在肥皂动作中,还可以找到键及其