2013-11-14 18 views
0

我正在寫一個簡單的Jison語法,以便在開始一個更復雜的項目之前獲得一些經驗。我嘗試了一個簡單的語法,它是逗號分隔的數字範圍列表,其中範圍的起始和結束值相同,以便使用單個數字簡寫。然而,當在一些測試輸入上運行生成的解析器時,我會得到一個錯誤,這對我來說很有意義。這裏是我想出了語法:Jison語法問題,生成dparser的奇怪錯誤

/* description: Parses end executes mathematical expressions. */ 

/* lexical grammar */ 
%lex 
%% 

\s+     /* skip whitespace */ 
[0-9]+    {return 'NUMBER'} 
"-"     {return '-'} 
","     {return ','} 
<<EOF>>    {return 'EOF'} 
.      {return 'INVALID'} 

/lex 

/* operator associations and precedence */ 

%start ranges 

%% /* language grammar */ 

ranges 
    : e EOF 
     {return $1;} 
    ; 

e : rng { $$ = $1;} 
    | e ',' e {alert('e,e');$$ = new Array(); $$.push($1); $$.push($3);} 
    ; 

rng 
    : NUMBER '-' NUMBER 
     {$$ = new Array(); var rng = {Start:$1, End: $3; }; $$.push(rng); } 
    | NUMBER 
     {$$ = new Array(); var rng = {Start:$1, End: $1; }; $$.push(rng);} 
    ; 

NUMBER: {$$ = Number(yytext);}; 

測試輸入是這樣的:

5-10,12-16 

輸出是:

Parse error on line 1: 
5-10,12-16 
^ 
Expecting '-', 'EOF', ',', got '8' 

如果它把一個 'A' 在前面我得到和預期有關找到「無效」的錯誤,但我沒有在輸入字符串中的「8」,所以我想知道如果這是一個內部狀態?

我用網上的解析器生成的:http://zaach.github.io/jison/try/

想法?

+0

當我嘗試你的語法,我得到一個轉換/減少衝突報告。 – Pointy

+0

我認爲「8」的意思是「標記類型8」,即「NUMBER」。 – Pointy

+0

此外,它看起來像你試圖使用「NUMBER」作爲終端符號和非終端。我認爲沒有問題。 – Pointy

回答

0

這種生產是混淆Jison(和它搞糊塗了,太:)):

NUMBER: {$$ = Number(yytext);}; 

NUMBER被認爲是一個終端,但上述生產聲明它作爲一個非末端用空體。既然它什麼都不能匹配,它立即匹配,並且你的語法不允許連續兩個NUMBER s。因此錯誤。

另外,你的語法是不明確的,儘管我想Jison的默認值將解決問題。儘管如此,明確一下會更好,因爲這很容易。您的規則:

e : rng 
    | e ',' e 

沒有規定如何,「聯營」:換句話說,rng , rng , rng是否應被視爲e , rngrng , e。第一種可能是對你更好,所以你應該把它明確寫入:

e : rng 
    | e ',' rng 

上述一個大好處是,你並不需要建立第二生產一個新的陣列;您可以將$3推至$1的末尾,並將$$設置爲$1

+0

這兩個評論都奏效了,我的javascript還存在另一個問題,但我能夠自己追蹤。我將發佈最終的工作語法,但評論太長了。 – rgvtim