CoffeeScriptのようにインデントなしで区切り記号をほとんど使用せずに、 Jisonを使用して言語を定義しようとしています。これは私が達成したいことのようなものです:
# Definition
object1, object2
property1 = value1,
property2 = value2
# Definition
object3 property = value
# Statement
object1 + object2 + object3
これは、いくつかのプロパティを持つ 3 つのオブジェクトを定義し、それらを追加します。最初の定義は名前のリストを使用して 2 つのオブジェクトを指定し、2 番目の定義は空白が重要でないことを示していることに注意してください。
名前のリストとプロパティのリストの間に開始記号と終了記号がないにもかかわらず、文法があいまいではないように感じます。文法では、すべての名前リストの後にプロパティ リストが続くことを指定しています。次のようなプロダクションを含む、定義を指定するだけの文法を書くと、これはすべてうまくいくようです。
definition
: name_list property_list
;
name_list
: name
| name_list ',' name
;
property_list
: property
| property_list ',' property
;
property
: name '=' name
;
ここで、文法の式部分の規則を、私が知る限りごく普通の方法で追加します。
expr
: expr '+' expr
| expr '/' expr
| name
;
Jison は、いくつかの番号付けされた状態のさまざまな先読みトークンの束に対して「複数のアクションが可能」であると不満を漏らしています。リダクション オプションは通常、次のようになります。
- reduce by rule: name_list -> name
- reduce by rule: expr -> name
文法は明確だと思いますが、どうすればこれをジソンに納得させることができますか? 1 つではなく 2 つのトークンを先読みする必要があるようですが、それは盲目的な推測であり、Jison のドキュメントでは、(まだ?) LL( k ) 文法をサポートしていないと述べています。