2012-05-04 180 views
3

我有一個語法文件 - 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;'] 
], 
+3

請在SO上發佈您的語法的必要部分和錯誤。 –

+0

添加到導致衝突的問題規則中。 –

+0

安東,如果您提供重現錯誤的步驟,它將幫助其他人幫助您。 –

回答

2

您當前的語法不具有PrimaryExpressionNoBrace,但我相信所發生與this舊版本的語法問題。

的衝突是由該生產原因造成的:

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

其中

  • 一個PrimaryExpression導出到PrimaryExpressionNoBrace再次有'(Expression)'

  • 表達派生於PrimaryExpressionNoBrace具有IDENTIFIERTHIS替代品

  • 一個ArrowFunctionExpression'(FormalParameterList) => Block'

  • FormalParameterListIDENTIFIERTHIS的替代品了。

因此,一個左括號的輸入,接着是IDENTIFIERTHIS將我們帶入一個LR-狀態不能減少PrimaryExpressionNoBraceFormalParameterList之間做出選擇,即,它具有降低,減少對普通法律的追隨者衝突(例如右括號)。單個令牌lookahead在這裏不夠有用,並且不支持更多。

+0

不是這個頁面https://github.com/zaach/jison/wiki/Deviations-From-Flex-Bison解釋說我們可以使用lookahead嗎? – TrexXx

+0

@TrexXx,這是關於詞法預測,就字符而言。當我說上面的超前時,這是解析器級別的前瞻性,用標記表示。 – Gunther

+0

好的,所以這是不可能與Jison一起使用語法分析器級別的lookahead?有沒有辦法避免語法衝突而不使用前瞻? – TrexXx