【问题标题】:Is this grammar ambiguous?这个语法有歧义吗?
【发布时间】:2013-02-11 14:34:12
【问题描述】:

我正在尝试使用 Jison 定义一种语言,使用很少的标点符号进行分隔 - 例如 CoffeeScript 但没有缩进。这就是我想要实现的目标:

# Definition
object1, object2
    property1 = value1,
    property2 = value2

# Definition
object3 property = value

# Statement
object1 + object2 + object3

这定义了三个具有一些属性的对象并添加它们。请注意,第一个定义使用名称列表指定了两个对象,第二个定义表明空格不应该很重要。

我觉得语法没有歧义,尽管名称列表和属性列表之间缺少开始和结束符号。语法规定每个名称列表后跟一个属性列表。如果我编写一个仅指定定义的语法,这一切似乎都可以正常工作,包括以下产品:

definition
    : name_list property_list
    ;

name_list
    : name
    | name_list ',' name
    ;

property_list
    : property
    | property_list ',' property
    ;

property
    : name '=' name
    ;

现在,我为语法的表达式部分添加规则,就我所知,以一种相当正常的方式:

expr
    : expr '+' expr
    | expr '/' expr
    | name
    ;

Jison 抱怨说,对于处于某种编号状态的一堆不同的前瞻标记,“可能有多种操作”。减少选项通常如下所示:

- reduce by rule: name_list -> name
- reduce by rule: expr -> name

我相信语法是明确的,但我怎样才能让 Jison 相信这一点?似乎它可能需要向前看两个标记而不是一个,但这是一个盲目的猜测,Jison 文档指出它不(还?)支持 LL(k) 语法。

【问题讨论】:

  • 是的,这是模棱两可的语法。从此question and answer获得帮助
  • 如果不查看property_list 的规则,很难判断。
  • @DavidGorsline 我添加了property_listproperty 作品。只是不想让问题太长。
  • @GrijeshChauhan 谢谢,我会尽力吸收。

标签: grammar bison bnf jison


【解决方案1】:

您没有显示整个语法,但看起来您的问题是它无法区分作为简单名称的 expr 和在名单。考虑输入

A B = C

A B C = D

第一种情况是具有一个属性的A 的单个定义,而第二种情况是表达式A 后跟B 的定义。

问题是解析器需要在查看A 并查看B 的前瞻后在这些情况之间做出决定,但它不能——它需要更多前瞻(查看@ 之后的内容) 987654330@)

您可以采取多种措施来避免这种情况,方法是更改​​您的语言或(有效地)获得额外的前瞻性。

  1. 更改语言。可能只有一个名称的语句没有任何意义。因此,您可以将语言更改为单独的 statement 规则,该规则不允许使用简单名称:

    statement: expr '+' expr | expr '/' expr ;
    expr: statement | name ;
    

    现在它可以区分 statementdeclaration 而无需额外的前瞻,因为 statement 必须包含一个运算符。

  2. 更换工具。您可以使用 bison 的 %glr-parser 选项或像 btyacc 这样可以处理非 LALR(1) 语法的工具。不过,我完全不确定 Jison 支持什么。

  3. 在词法分析器中模拟额外的前瞻。你可以让你的词法分析器为你做额外的预测。您可以有一个匹配[a-zA-Z]+[ \t\n]*= 的词法分析器模式(即,一个名称后跟一个= 符号)并让它返回一个特殊的propname 标记而不是name。那么你的property 规则变为:

    property: propname name ;
    

【讨论】:

  • 谢谢!这些都是很好的建议;我将尝试实施它们。我之前在尝试禁止单名语句时遇到了问题,但是您描述的内容很简单,以至于我看不出它为什么行不通!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多