如何避免语法冲突

时间:2012-05-04 20:46:18

标签: javascript parser-generator jison

我有一个语法文件 - 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;']
],

1 个答案:

答案 0 :(得分:2)

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

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

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

其中

  • PrimaryExpression派生于PrimaryExpressionNoBrace '( Expression )'

  • 表达式再次派生到PrimaryExpressionNoBrace,其IDENTIFIERTHIS替代

  • ArrowFunctionExpression'( FormalParameterList ) => Block'

  • FormalParameterList也有IDENTIFIERTHIS个替代品。

因此,左括号的输入,后跟IDENTIFIERTHIS将我们带入LR状态,无法在缩减为PrimaryExpressionNoBraceFormalParameterList之间做出决定,即它减少了对普通法律追随者的冲突(例如右括号)。单个令牌前瞻在这里是不够的,并且不再支持更多。