2014-10-19 32 views
1

我試圖在Jison中實現解析器。解析器支持兩種JSON對象:{ a: 1 }和塊:if (true) { statement(); }空塊和空對象語法衝突警告

我的語法是這樣的:

block: 
    : '{' '}' 
    | '{' statementList '}' 
    ; 

objectExpression: 
    : '{' '}' 
    | '{' properties '}' 
    ; 

有兩個blockobjectExpression一個{}規則,因爲我需要同時支持空對象和空塊。

它的工作原理,但它輸出很多警告,如:

Conflict in grammar: multiple actions possible when lookahead token is ; in state 52 
- reduce by rule: objectExpression -> { } 
- reduce by rule: block -> { } 

我怎樣才能解決或抑制這些警告?

回答

2

可以將字符串{}解析爲塊或objectExpression。你有幾個選擇。

在Javascript解析器中,如果在blockobjectExpression之間存在歧義,它將選擇父規則中第一個出現的那個。在下面的表達式中,空塊將優先於空對象。

expression: 
    : block 
    | objectExpression 
    ; 

解析器會抱怨任何含糊不清(也稱爲shift/reduce衝突),但它仍然有效。假設Jison解析器與Bison解析器兼容,請使用expect declaration來抑制警告。

您還可以使塊和objectExpressions僅出現在不同的上下文中(例如塊只能出現在語句iffor語句之後)。第三個選擇是刪除對空對象的支持。

1

我結束了通過添加另一個規則法:

\{\} return 'EMPTY_OBJECT'; 

和改變objectExpression到:

objectExpression: 
    : 'EMPTY_OBJECT' 
    | '{' properties '}' 
    ; 

它的工作(即使它是一個有點難看)。

+0

我很懷疑這個解決方案是否真正起作用(而不僅僅是因爲它令人混淆地使'{}'和'{}'在句法上不同)。徹底測試它。正確的解決方案將涉及識別兩個空括號語法可能出現的上下文。 – rici 2014-10-19 22:18:06