我正在寫一個簡單的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/
想法?
當我嘗試你的語法,我得到一個轉換/減少衝突報告。 – Pointy
我認爲「8」的意思是「標記類型8」,即「NUMBER」。 – Pointy
此外,它看起來像你試圖使用「NUMBER」作爲終端符號和非終端。我認爲沒有問題。 – Pointy