Commits

camlspotter committed 6cd8a75

indent

Comments (0)

Files changed (1)

 
 P4 では LL のパーサーを書くためのストリームパターンマッチのための DSL が用意されている。(この特殊文法も P4 で書かれているとかまあ再帰っぽいのでワクワクするかもしれないが時間の無駄なのでさっさと先に進もう)
 
+拡張を伴わない文法ルールの基礎
+-------------------------------------------
+
+LL ではあるがルール記述は yacc の様なちょっと BNF っぽい書き方ができる DSL が用意されている:
+
+* ルール名: [ ケースグループ | ケースグループ | .. ]
+* ケースグループ: [ ケース | ケース | .. ] もしくは "名前" associativity [ ケース | ケース | .. ] (名前と associativity(LEFTA など) は省略できる)
+* ケース: ストリームパターン -> Camlp4Ast を生成する式
+* ストリームパターン内で自分自信を参照する場合は SELF を使う。(これは継承時の自己参照に必要からだと思われる)
+
+Yacc と異なりケースの実行は上から下へ。なので順番は重要。
+
+わかりますよね?わからない?えっ、パーサーの基礎も知らずに P4 とか無理ですよ?言わなかったけど。
+ 
 改造の基本
 ----------
 
 文法拡張はテンプレの Syntax という functor 引数内部で既に定義された文法ルールを基に
 新しいルールセットを作ることで行う。そのために、
 
-* 文法ルールのケース全体を消してしまう
-* 文法ルールの中のケースを消してしまう
-* 既存の文法ルールの中のケースの前後に新しいケースを付け加える
+* 文法ルールのケースグループ全体を消してしまう: Gram.Entry.clear
+* 文法ルールの中のケースを消してしまう: DELETE_RULE Gram 名前: パターン END; で消す。パターンはケースを選択するために必要
+* EXTEND Gram ... END を書いてその中に付け加えるルールやケースを書く
+    * GLOBAL 宣言で自分が今からいじりたい既存の文法ルールを列挙せよ! なんで必要なのか、理由は分かんねー。
+    * 既存の文法ルールの中のケースの前後に新しいケースを付け加える: 普通に追加分だけのケースをルールに書いておくと、既存のケースの最後にルールが付け加えられる
+    * 文法ルール名: BEFORE "hogehoge" [ ケースグループ ] ; などと書いてケースグループを挿入する場所を指定することもできる。指定しなければ一番最後に加えられる。BEFORE(すぐ前)の他に AFTER(すぐ後), LEVEL(同じところ?) などが使える。
 
-などの操作を行う DSL も用意されている。
 
 元の文法はどこに定義されていますか
 --------------------------------------
 
 とこき下ろしたが、実のところ Camlp4OCamlParser.ml は最も複雑な P4 文法拡張なので、ルールの削除や追加の例はこのファイルを眺めるのが最適である。読むなよ!眺めるだけだ!
 
-何をしたら良いですか 
--------------------------------------------
-
-Camlp4OCamlParser.ml を眺めて得た知識を教えてあげよう:
-
-* 既存ルールケースでいらないものがあったら DELETE_RULE Gram 名前: パターン END; で消す。パターンはケースを選択するために必要
-* 既存文法ルールのケース全体を消したかったら Gram.Entry.clear で消す。
-* EXTEND Gram ... END を書け
-    * GLOBAL 宣言で自分が今からいじりたい既存の文法ルールを列挙せよ! なんで必要なのか、理由は分かんねー。
-      多分これを書かないでルールを作ると既存のと平行な同名だけど違うルールとか作ってしまうんじゃねーか。
-    * 文法ルール名: [ [ ケース | ケース | .. ] [ ケース | ケース | .. ] .. ] ;
-    * ケースは ストリームパターン -> Camlp4Astを作る式
-    * 文法ルール名: BEFORE "hogehoge" [ [ ケース | ケース | .. ] ] ; などと書いてルールを挿入する場所を指定することもできる。指定しなければ一番最後に加えられる。ケースは上から順番にマッチされるはず。BEFORE の他に AFTER, LEVEL などが使える。
-    * ケースグループは "hogehoge" [ ケース | ケース | .. ] の様に名前をつけたり、 "hogehoge" LEFTA [ ケース | ケース | .. ] のように connectivity を指定することができる
-