【问题标题】:How to avoid conflicts in grammar如何避免语法冲突
【发布时间】:2012-05-04 20:46:18
【问题描述】:

我有一个语法文件——https://github.com/itrelease/fubar-script/blob/jsast/src/grammar.js,但我得到了conflicts,我真的不知道如何解决这个问题。如果有人能给我解释一下,那会很有帮助。

这条规则产生conflicts:

ParamVar: [
  ['Identifier', '$$ = $Identifier;'],
  ['THIS', '$$ = new yy.ThisExpression();']
],

PrimaryExpression: [
  ['THIS', '$$ = new yy.ThisExpression();'],
  ['Literal', '$$ = $Literal;'],
  ['ArrayLiteral', '$$ = $ArrayLiteral;'],
  ['Identifier', '$$ = $Identifier;'],
  ['ObjectLiteral', '$$ = $ObjectLiteral;'],
  ['( Expression )', '$$ = $Expression;']
],

【问题讨论】:

  • 请在此处发布您的语法的必要部分和错误。
  • 添加到导致冲突的问题规则中。
  • Anton,如果您提供重现错误所采取的步骤,它将帮助其他人帮助您。

标签: javascript parser-generator jison


【解决方案1】:

您当前的语法没有PrimaryExpressionNoBrace,但我认为问题出现在this 较旧版本的语法上。

冲突是由这个产生引起的:

MemberExpression: [
      ['PrimaryExpression', '$$ = $PrimaryExpression;'],
      ['ArrowFunctionExpression', '$$ = $ArrowFunctionExpression'],
      ...

在哪里

  • PrimaryExpression 派生为具有'( Expression )'PrimaryExpressionNoBrace

  • 表达式再次派生为具有IDENTIFIERTHIS 替代项的PrimaryExpressionNoBrace

  • ArrowFunctionExpression'( FormalParameterList ) => Block'

  • FormalParameterList 也有 IDENTIFIERTHIS 替代品。

因此,左括号的输入,后跟 IDENTIFIERTHIS 将我们带入 LR 状态,无法决定归约到 PrimaryExpressionNoBraceFormalParameterList,即它存在归约归约冲突关于常见的合法追随者(例如右括号)。单个令牌前瞻在这里是不够的,不支持更多。

【讨论】:

  • 这个页面github.com/zaach/jison/wiki/Deviations-From-Flex-Bison不是解释了我们可以使用前瞻吗?
  • @TrexXx,这是关于词法分析器的前瞻,就字符而言。当我在上面说前瞻时,这是解析器级别的前瞻,就标记而言。
  • 好的,所以这不可能在 Jison 中使用解析器级别的前瞻?有没有办法在不使用前瞻的情况下避免语法冲突?
  • @TrexXx,有一个令牌的前瞻,这在这种情况下是不够的,即当仍有多种可能性时需要做出决定。为了解决这个问题,可能(虽然不是很好)将)=> 组合成一个令牌。请注意,这可能需要额外处理词法分析器中的嵌入空格。否则,在解析算法施加的约束下,必须以一种在足够信息可用之前不要求做出决定的方式重写语法。
  • 你可以做的是放弃ParamVar 并改用Expr,这样可以避免提前决定。但是,它确实允许不需要的语法,然后必须在解析后将其阻止。
猜你喜欢
  • 1970-01-01
  • 2011-07-02
  • 2018-02-03
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
相关资源
最近更新 更多