2016-04-23 58 views
1

我試圖用jison(http://zaa.ch/jison/docs/)編寫簡單的解析器,停留在描述文本中。語法衝突:可能發生多個動作

%lex 

%% 
[\s\n\t]+     return 'TK_SPACE'; 
[0-9]+("."[0-9]+)?\b  return 'TK_NUMBER'; 
[a-zA-Z]+([a-zA-Z0-9]+)?\b return 'TK_WORD'; 
<<EOF>>      return 'EOF'; 

/lex 

%start document 

%% 

document 
    : nodes EOF 
    { console.log($1); } 
    | EOF 
    ; 

nodes 
    : nodes node 
    { $1.push($2); $$ = $1; } 
    | node 
    { $$ = [$1]; } 
    ; 

node 
    : text 
    ; 

text 
    : text text_element 
    { $$ = $1 + $2; } 
    | text_element 
    ; 

text_element 
    : TK_NUMBER 
    | TK_WORD 
    | TK_SPACE 
    ; 

此警告編譯語法。

Conflict in grammar: multiple actions possible when lookahead token is TK_SPACE in state 5 
- reduce by rule: node -> text 
- shift token (then go to state 9) 
Conflict in grammar: multiple actions possible when lookahead token is TK_WORD in state 5 
- reduce by rule: node -> text 
- shift token (then go to state 8) 
Conflict in grammar: multiple actions possible when lookahead token is TK_NUMBER in state 5 
- reduce by rule: node -> text 
- shift token (then go to state 7) 

States with conflicts: 
State 5 
    node -> text . #lookaheads= TK_SPACE TK_WORD TK_NUMBER EOF 
    text -> text .text_element #lookaheads= EOF TK_NUMBER TK_WORD TK_SPACE 
    text_element -> .TK_NUMBER 
    text_element -> .TK_WORD 
    text_element -> .TK_SPACE 

但是,如果我試圖解析文本,它工作正常。這不是完整版本的代碼,只是帶有文本的版本。我想追加node中的節點功能。

回答

4

問題是您的語法模棱兩可 - nodes由一個或一個模式爲node的序列組成,沒有分隔符。 A nodetext,其由一個或多個text_element組成,並且沒有分隔符。所以當一個node結束並且下一個開始時沒有辦法知道。例如,如果您輸入的序列號爲3 text_elements,則它可能是一個單獨的node,全部爲3,也可能爲3 node,每個都有一個。

野牛將「解決」這一衝突的總是寧願轉移了減少,這將總是喜歡製造較大text對象,這樣的規則nodes: nodes node將永遠不會減少,可能也只是從語法中移除。由於這是一個純粹的歧義(而不是預見性問題),所以產生的語法匹配相同的語言,所以這可能不成問題。我假設jison(或者你實際使用的任何分析器生成器)是相同的。

但是,通常情況下,衝突是一個問題,因爲這意味着由生成的分析器分析的語法不是您指定的語法。找出解析器實際分析的語法不是微不足道的,需要仔細瞭解shoft-reduce解析如何工作以及解析器生成器實際生成的狀態。這些信息都在.output文件中(由野牛製作,-v - 其他生成器可能不同),但您需要閱讀並理解它。

+0

如何描述xml元素內的文本? '文本文本文本'。我有這樣的東西:'node:open_tag | close_tag | text'。 –

+0

嗯,我想我得到這個。我已經解決了它像很多簡短的元素。會在之後加入他們。 –