私はJison(Bison)を使用して単純なマークアップ言語を作成しています。私は明らかにこれに慣れていませんが、わずかなバリエーションが非常にうまく機能しています。S/Rの競合の原因がわかりません。
'Text'が2つのレクサーアクション(開始条件が異なる)によって返されることは問題ではないようです。文法のルールが少なくなり、ユーザーへのエラーメッセージが一貫しているため、これが気に入っています。コンテキストに関係なく「テキスト」ルールを共通にすることを試みました。また、各トークンに異なる名前を付けることも試みましたが、すべてが一緒になっている場合、S/R競合には影響がないようです。
パーサーは、プレーンテキスト、サブ配列、およびさまざまな特殊ノードを含むjsonオブジェクトを作成することを目的としています。
仕様:
/* lexical grammar */
%lex
%s bracketed
%%
<bracketed>(\\.|[^\\\,\[\]])+ { yytext = yytext.replace(/\\(.)/g, '$1'); return 'Text'; }
<INITIAL>(\\.|[^\\\[])+ { yytext = yytext.replace(/\\(.)/g, '$1'); return 'Text'; }
"[" { this.begin('bracketed'); return '['; }
"]" { this.popState(); return ']'; }
"," return ','
<<EOF>> return 'END'
/lex
%start template
%%
template
: sentence END
;
sentence
: /* empty */
| sentence Text
| sentence '[' ']'
| sentence '[' dynamic ']'
;
dynamic
: sentence
/*| dynamic ',' sentence*/
;
警告:
Conflict in grammar: multiple actions possible when lookahead token is ] in state 5
- reduce by rule: sentence ->
- shift token (then go to state 6)
States with conflicts:
State 5
sentence -> sentence [ .] #lookaheads= END Text [ ]
sentence -> sentence [ .dynamic ] #lookaheads= END Text [ ]
dynamic -> .sentence #lookaheads= ]
sentence -> . #lookaheads= ] Text [
sentence -> .sentence Text
sentence -> .sentence [ ]
sentence -> .sentence [ dynamic ]
ジェネレータアルゴリズムが異なれば、多かれ少なかれ問題がありますが、すべて問題があるようです。
ありがとう!