racc 1.4.9-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. data/.gemtest +0 -0
  2. data/COPYING +515 -0
  3. data/ChangeLog +846 -0
  4. data/DEPENDS +4 -0
  5. data/Manifest.txt +105 -0
  6. data/README.ja.rdoc +96 -0
  7. data/README.rdoc +86 -0
  8. data/Rakefile +51 -0
  9. data/TODO +5 -0
  10. data/bin/racc +308 -0
  11. data/bin/racc2y +195 -0
  12. data/bin/y2racc +339 -0
  13. data/ext/racc/MANIFEST +4 -0
  14. data/ext/racc/cparse.c +824 -0
  15. data/ext/racc/depend +1 -0
  16. data/ext/racc/extconf.rb +5 -0
  17. data/fastcache/extconf.rb +2 -0
  18. data/fastcache/fastcache.c +185 -0
  19. data/lib/racc.rb +6 -0
  20. data/lib/racc/compat.rb +40 -0
  21. data/lib/racc/debugflags.rb +59 -0
  22. data/lib/racc/exception.rb +15 -0
  23. data/lib/racc/grammar.rb +1115 -0
  24. data/lib/racc/grammarfileparser.rb +559 -0
  25. data/lib/racc/info.rb +16 -0
  26. data/lib/racc/iset.rb +91 -0
  27. data/lib/racc/logfilegenerator.rb +211 -0
  28. data/lib/racc/parser-text.rb +479 -0
  29. data/lib/racc/parser.rb +474 -0
  30. data/lib/racc/parserfilegenerator.rb +512 -0
  31. data/lib/racc/pre-setup +13 -0
  32. data/lib/racc/sourcetext.rb +34 -0
  33. data/lib/racc/state.rb +971 -0
  34. data/lib/racc/statetransitiontable.rb +316 -0
  35. data/lib/racc/static.rb +5 -0
  36. data/misc/dist.sh +31 -0
  37. data/rdoc/en/NEWS.en.rdoc +282 -0
  38. data/rdoc/en/command.en.html +78 -0
  39. data/rdoc/en/debug.en.rdoc +20 -0
  40. data/rdoc/en/grammar.en.rdoc +230 -0
  41. data/rdoc/en/index.en.html +10 -0
  42. data/rdoc/en/parser.en.rdoc +74 -0
  43. data/rdoc/en/usage.en.rdoc +83 -0
  44. data/rdoc/ja/NEWS.ja.rdoc +307 -0
  45. data/rdoc/ja/command.ja.html +94 -0
  46. data/rdoc/ja/debug.ja.rdoc +36 -0
  47. data/rdoc/ja/grammar.ja.rdoc +348 -0
  48. data/rdoc/ja/index.ja.html +10 -0
  49. data/rdoc/ja/parser.ja.rdoc +125 -0
  50. data/rdoc/ja/usage.ja.html +414 -0
  51. data/sample/array.y +67 -0
  52. data/sample/array2.y +59 -0
  53. data/sample/calc-ja.y +66 -0
  54. data/sample/calc.y +65 -0
  55. data/sample/conflict.y +15 -0
  56. data/sample/hash.y +60 -0
  57. data/sample/lalr.y +17 -0
  58. data/sample/lists.y +57 -0
  59. data/sample/syntax.y +46 -0
  60. data/sample/yyerr.y +46 -0
  61. data/setup.rb +1587 -0
  62. data/tasks/doc.rb +12 -0
  63. data/tasks/email.rb +55 -0
  64. data/test/assets/chk.y +126 -0
  65. data/test/assets/conf.y +16 -0
  66. data/test/assets/digraph.y +29 -0
  67. data/test/assets/echk.y +118 -0
  68. data/test/assets/err.y +60 -0
  69. data/test/assets/expect.y +7 -0
  70. data/test/assets/firstline.y +4 -0
  71. data/test/assets/ichk.y +102 -0
  72. data/test/assets/intp.y +546 -0
  73. data/test/assets/mailp.y +437 -0
  74. data/test/assets/newsyn.y +25 -0
  75. data/test/assets/noend.y +4 -0
  76. data/test/assets/nonass.y +41 -0
  77. data/test/assets/normal.y +27 -0
  78. data/test/assets/norule.y +4 -0
  79. data/test/assets/nullbug1.y +25 -0
  80. data/test/assets/nullbug2.y +15 -0
  81. data/test/assets/opt.y +123 -0
  82. data/test/assets/percent.y +35 -0
  83. data/test/assets/recv.y +97 -0
  84. data/test/assets/rrconf.y +14 -0
  85. data/test/assets/scan.y +72 -0
  86. data/test/assets/syntax.y +50 -0
  87. data/test/assets/unterm.y +5 -0
  88. data/test/assets/useless.y +12 -0
  89. data/test/assets/yyerr.y +46 -0
  90. data/test/bench.y +36 -0
  91. data/test/helper.rb +91 -0
  92. data/test/infini.y +8 -0
  93. data/test/scandata/brace +7 -0
  94. data/test/scandata/gvar +1 -0
  95. data/test/scandata/normal +4 -0
  96. data/test/scandata/percent +18 -0
  97. data/test/scandata/slash +10 -0
  98. data/test/src.intp +34 -0
  99. data/test/start.y +20 -0
  100. data/test/test_chk_y.rb +51 -0
  101. data/test/test_grammar_file_parser.rb +15 -0
  102. data/test/test_racc_command.rb +155 -0
  103. data/test/test_scan_y.rb +51 -0
  104. data/test/testscanner.rb +51 -0
  105. data/web/racc.en.rhtml +42 -0
  106. data/web/racc.ja.rhtml +51 -0
  107. metadata +233 -0
@@ -0,0 +1,307 @@
1
+ = NEWS
2
+
3
+ === 1.4.6
4
+
5
+ * バグの修正
6
+
7
+ * bin/racc -g オプションを -t に改名
8
+ * racc/compiler.rb を削除
9
+ * '|' が meta rules によって許可
10
+ * Ruby 1.8.7 互換性を修正
11
+ * Ruby 1.9 互換性を修正
12
+
13
+ === 1.4.5 (2005-11-21)
14
+ * [FEATURE CHANGE] --no-extensions オプションを削除
15
+ * [fix] racc パッケージのみで -E を使えるように修正
16
+ * [fix] --no-omit-actions が動作していなかったのを修正
17
+ * setup.rb 3.4.1.
18
+
19
+ === 1.4.4 (2003-10-12)
20
+ * Ruby 1.8.0 に対応するリリース。本体に変更はなし
21
+ * -all パッケージに strscan, amstd の同梱するのをやめた
22
+ * setup.rb 3.2.1
23
+
24
+ === 1.4.3 (2002-11-14)
25
+ * [fix] ruby 1.8 の警告を消した
26
+
27
+ === 1.4.2 (2002-01-29)
28
+ * [new] 新しいオプション --no-extentions
29
+
30
+ === 1.4.1 (2001-12-02)
31
+ * amstd 非依存になった (ただし -all パッケージへバンドルは継続)
32
+ * y2racc racc2y を 1.4 対応にした
33
+
34
+ === 1.4.0 (2001-11-30)
35
+ * ランタイムを Ruby の CVS に入れたのにあわせてマイナーバージョンアップ
36
+ * RaccParser, RaccScanner → GrammarFileParser, GrammarFileScanner
37
+ * ハズい typo を修正 (grammer → grammar)
38
+
39
+ === 1.3.12 (2001-11-22)
40
+ * インストーラのバグを修正 (thanks Tanaka Akira)
41
+ * アクション中の正規表現や % 文字列、グローバル変数の検出を向上させた
42
+
43
+ === 1.3.11 (2001-08-28)
44
+ * アクション中の $' $` $/ などを正しくスキャン
45
+
46
+ === 1.3.10 (2001-08-12)
47
+ * cparse.c のプロトタイプ違いを直した
48
+
49
+ === 1.3.9 (2001-04-07)
50
+ * Ruby 1.4 に(再び)対応した
51
+
52
+ === 1.3.8 (2001-03-17)
53
+ * パースエラーの時に記号名も出力するようにした
54
+ * Racc::Parser#token_to_s
55
+
56
+ === 1.3.7 (2001-02-04)
57
+ * サンプルを増やした
58
+
59
+ === 1.3.6 (2001-01-22)
60
+ * cparse がスタティックリンクされても動くようにした
61
+
62
+ === 1.3.5 (2001-01-18)
63
+ * % 文字列のスキャンがバグってた
64
+ * 新しい命令 expect
65
+
66
+ === 1.3.4 (2001-01-11)
67
+ * cparse: シンボルのタイプチェックを入れた
68
+ * cparse: depend を消した
69
+ * cparse: rb_iterate 中の GC で落ちるバグを修正
70
+
71
+ === 1.3.3 (2000-12-25)
72
+ * ジェネレータに致命的なバグ。1.3.1 から混入 (format.rb)
73
+ * racc --runtime-version
74
+
75
+ === 1.3.2 (2000-12-21)
76
+ * -E が失敗するのを直した
77
+ * 再度 strscan を同梱 (y2racc/racc2y に必要)
78
+
79
+ === 1.3.1 (2000-12-17)
80
+ * 正規表現の繰り返し指定の上限を動的に決定する (RE_DUP_MAX)
81
+ * パースルーチンが常に Ruby 版になっていた (消し忘れ)
82
+
83
+ === 1.3.0 (2000-11-30)
84
+ * スキャナから yield でトークンを渡せるようになった
85
+
86
+ === 1.2.6 (2000-11-28)
87
+ * class M::C を許した
88
+
89
+ === 1.2.5 (2000-11-20)
90
+ * オプションに大変動。非互換オプションは -h -f -p -i -n -c -A
91
+ * ロングオプションをサポート
92
+ * y2racc, racc2y はデフォルトでアクションを残すようにした
93
+
94
+ === 1.2.4 (2000-09-13)
95
+ * インストーラとドキュメントを更新
96
+
97
+ === 1.2.3 (2000-08-14)
98
+ * 使われない規則と非終端記号を出力 (強力版)
99
+ * S/R conflict の時 nonassoc で解決するならばエラー
100
+
101
+ === 1.2.2 (2000-08-12)
102
+ * 内部の変更
103
+
104
+ === 1.2.1 (2000-08-05)
105
+ * yacc との変換コマンド racc2y・y2racc を添付
106
+
107
+ === 1.2.0 (2000-08-02)
108
+ * 先読みアルゴリズムを bison のものに変更
109
+
110
+ === 1.1.6 (2000-07-25)
111
+ * 新たなキーワード options とその引数 no_result_var
112
+
113
+ === 1.1.5 (2000-07-21)
114
+ * [重要] token を convert に変更
115
+ * 「新たな」キーワード token (終端記号の宣言)
116
+
117
+ === 1.1.4 (2000-07-13)
118
+ * サンプルがバグってた
119
+
120
+ === 1.1.3 (2000-06-30)
121
+ * 空アクションの呼び出しを省略しないようにするオプション -a
122
+
123
+ === 1.1.2 (2000-06-29)
124
+ * スキャナで strscan を使わないようにした
125
+ * ScanError -> Racc::ScanError, ParseError -> Racc::ParseError
126
+ * エラーメッセージを強化
127
+
128
+ === 1.1.1 (2000-06-15)
129
+ * requireミス (thanks Toshさん)
130
+ * -v をつけるとconflictが報告されなくなっていた
131
+
132
+ === 1.1.0 (2000-06-12)
133
+ * 新しい 状態遷移表生成アルゴリズム
134
+
135
+ === 1.0.4 (2000-06-04)
136
+ * S/R conflict がおきると .output 出力で落ちるバグ修正 (Tosh さんの報告)
137
+ * 使われない非終端記号・規則を表示
138
+
139
+ === 1.0.3 (2000-06-03)
140
+ * filter -> collect!
141
+
142
+ === 1.0.2 (2000-05-16)
143
+ * インストーラをアップデート
144
+
145
+ === 1.0.1 (2000-05-12)
146
+ * state.rb: 先読みルーチンをちょっとだけ高速化 && 追加デバッグ
147
+ * コードを整理した。著作権表示全体を全部のファイルにつけた。
148
+ * amstd アップデート (1.7.0)
149
+
150
+ === 1.0.0 (2000-05-06)
151
+ * バージョン 1.0
152
+
153
+ === 0.14.6 (2000-05-05)
154
+ * デバッグ出力を詳細にした
155
+
156
+ === 0.14.5 (2000-05-01)
157
+ * インストーラを ruby 1.4.4 系の新しいパスに対応させた
158
+
159
+ === 0.14.4 (2000-04-09)
160
+ * パーサの定数を削減(Racc_arg にまとめた)
161
+ * state 生成を微妙に高速化(コアを文字列に変換)
162
+
163
+ === 0.14.3 (2000-04-04)
164
+ * cparse の SYM2ID と ID2SYM のチェックを分離 (thanks 小松さん)
165
+
166
+ === 0.14.2 (2000-04-03)
167
+ * 一行目の class がパースエラーになっていた (thanks 和田さん)
168
+ * 新しいフラグ racc -V
169
+
170
+ === 0.14.1 (2000-03-31)
171
+
172
+ === 0.14.0 (2000-03-21)
173
+ * 高速テーブルを実装
174
+ * 一時的にファイル名/行番号の変換をやめた(Rubyのバグのため。)
175
+
176
+ === 0.13.1 (2000-03-21)
177
+ * --version --copyright などがうまく働いてなかった (thanks ふなばさん)
178
+
179
+ === 0.13.0 (2000-03-20)
180
+ * yyerror/yyerrok/yyaccept を実装
181
+
182
+ === 0.12.2 (2000-03-19)
183
+ * -E フラグがバグってた (thanks ふなばさん)
184
+
185
+ === 0.12.1 (2000-03-16)
186
+ * デフォルトアクションの決め方をちょっと修正(元に戻しただけ)
187
+
188
+ === 0.12.0 (2000-03-15)
189
+ * 完全な LALR を実装したら遅くなったので SLR も併用するようにした。効果絶大。
190
+
191
+ === 0.11.3 (2000-03-09)
192
+ * 状態遷移表生成のバグの修正がまだ甘かった。さらに別のバグもあるようだ。
193
+
194
+ === 0.11.2 (2000-03-09)
195
+ * cparse が Symbol に対応できてなかった
196
+
197
+ === 0.11.1 (2000-03-08)
198
+ * ruby 1.5 の Symbol に対応
199
+ * strscan を最新に
200
+
201
+ === 0.11.0 (2000-02-19)
202
+ * 例外のとき、元のファイルの行番号が出るようにした
203
+
204
+ === 0.10.9 (2000-01-19)
205
+ * セットアップ方法など細かな変更
206
+
207
+ === 0.10.8 (2000-01-03)
208
+ * 忘れてしまったけどたしかインストーラ関係の修正
209
+ * (1/17 repacked) ドキュメントの追加と修正
210
+
211
+ === 0.10.7 (2000-01-03)
212
+ * setup.rb compile.rb amstd/inst などのバグ修正
213
+
214
+ === 0.10.6 (1999-12-24)
215
+ * racc -e ruby でデフォルトパスを使用
216
+ * 空のアクションの呼びだしは省略するようにした
217
+
218
+ === 0.10.5 (1999-12-21)
219
+ * 埋めこみアクションの実装がすさまじくバグってた
220
+ * setup.rb が inst.rb の変化に追従してなかった
221
+ * calc.y calc2.y を 0.10 用に修正
222
+
223
+ === 0.10.4 (1999-12-19)
224
+ * エラー回復モードを実装
225
+ * racc -E で単体で動作するパーサを生成
226
+ * Racc は class から module になった
227
+
228
+ === 0.10.3 (1999-12-01)
229
+ * 埋めこみアクションをサポート
230
+ * .output の出力内容にバグがあったのを修正
231
+
232
+ === 0.10.2 (1999-11-27)
233
+ * ドキュメントの訂正と更新
234
+ * libracc.rb を分割
235
+
236
+ === 0.10.1 (1999-11-19)
237
+ * C でランタイムを書きなおした
238
+ * next_token が false を返したらもう読みこまない
239
+ * アクションがトークンによらず決まるときは next_token を呼ばない
240
+ * $end 廃止
241
+ * LALRactionTable
242
+
243
+ === 0.10.0 (1999-11-06)
244
+ * next_* を next_token に一本化、peep_token 廃止
245
+ * @__debug__ -< @yydebug など変数名を大幅変更
246
+ * 文法ファイルの構造が class...rule...end に変わった
247
+ * コアのコードを一新、高速化
248
+ * strscan を併合
249
+ * ライブラリを racc/ ディレクトリに移動
250
+
251
+ === 0.9.5 (1999-10-03)
252
+ * 0.9.4 の変更がすごくバグってた
253
+ * $end が通らなかったのを修正
254
+ * __show_stack__ の引数が違ってた
255
+
256
+ === 0.9.4 (1999-09-??)
257
+ * Parser::Reporter をなくしてメソッドに戻した
258
+ * d.format.rb を再編成
259
+
260
+ === 0.9.3 (1999-09-03)
261
+ * racc.rb -> racc
262
+
263
+ === 0.9.2 (1999-06-26)
264
+ * strscan使用
265
+
266
+ === 0.9.1 (1999-06-08)
267
+ * アクション中の正規表現に対応 ( /= にも注意だ)
268
+ * アクション中の # コメントに対応
269
+
270
+ === 0.9.0 (1999-06-03)
271
+ * アクションを { } 形式にした
272
+ * ユーザーコードを '----' を使う形式にした
273
+
274
+ === 0.8.11 (?)
275
+ * -g の出力をわかりやすくした
276
+
277
+ === 0.8.10 (?)
278
+ * アクションからreturnできるようにした
279
+
280
+ === 0.8.9 (1999-03-21)
281
+ * -g + @__debug__をつかったデバッグメッセージ操作
282
+ * エラー発生時のバグを修正
283
+ * TOKEN_TO_S_TABLEを付加するようにした
284
+
285
+ === 0.8.8 (1999-03-20)
286
+ * 100倍程度の高速化
287
+ * defaultトークンを加えた
288
+ * デバッグ用ソースを出力するオプション-gをくわえた
289
+ * user_initializeを廃止し、普通にinitializeを使えるようにした
290
+ * parse_initialize/finalize,parseメソッドを廃止
291
+ * next_token,next_value,peep_tokenのデフォルトを廃止
292
+ * %precと同等の機能を加えた
293
+
294
+ === 0.8.7 (1999-03-01)
295
+ * 内部構造が大幅に変化
296
+ * マニュアルがHTMLになった
297
+
298
+ === 0.8.0 (1999-01-16)
299
+ * 文法がブロック型に変化
300
+
301
+ === 0.5.0 (1999-01-07)
302
+ * 演算子優先順位が実装されたようだ
303
+ * スタート規則が実装されたようだ
304
+ * トークン値の置換が実装されたようだ(後に致命的なバグ発見)
305
+
306
+ === 0.1.0 (1999-01-01)
307
+ * とにかく動くようになった
@@ -0,0 +1,94 @@
1
+ <h1>Raccコマンドリファレンス</h1>
2
+ <p>
3
+ racc [-o<var>filename</var>] [--output-file=<var>filename</var>]
4
+ [-e<var>rubypath</var>] [--embedded=<var>rubypath</var>]
5
+ [-v] [--verbose]
6
+ [-O<var>filename</var>] [--log-file=<var>filename</var>]
7
+ [-g] [--debug]
8
+ [-E] [--embedded]
9
+ [-l] [--no-line-convert]
10
+ [-c] [--line-convert-all]
11
+ [-a] [--no-omit-actions]
12
+ [-C] [--check-only]
13
+ [-S] [--output-status]
14
+ [--version] [--copyright] [--help] <var>grammarfile</var>
15
+ </p>
16
+
17
+ <dl>
18
+ <dt><var>filename</var>
19
+ <dd>
20
+ Raccの文法ファイルを指定します。拡張子には特に制限はありません。
21
+ </dd>
22
+ <dt>-o<var>outfile</var>, --output-file=<var>outfile</var>
23
+ <dd>
24
+ 作成するクラスをかきこむファイル名を指定します。デフォルトは<filename>.tab.rbです。
25
+ </dd>
26
+ <dt>-O<var>filename</var>, --log-file=<var>filename</var>
27
+ <dd>
28
+ -v オプションをつけた時に生成するログファイルの名前を
29
+ <var>filename</var> に変更します。
30
+ デフォルトは <var>filename</var>.output です。
31
+ </dd>
32
+ <dt>-e<var>rubypath</var>, --executable=<var>rubypath</var>
33
+ <dd>
34
+ 実行可能ファイルを生成します。<var>rubypath</var>は Ruby 本体のパスです。
35
+ <var>rubypath</var>を単に 'ruby' にした時には Racc が動作している
36
+ Ruby のパスを使用します。
37
+ </dd>
38
+ <dt>-v, --verbose
39
+ <dd>
40
+ ファイル "filename".output に詳細な解析情報を出力します。
41
+ </dd>
42
+ <dt>-g, --debug
43
+ <dd>
44
+ 出力するコードにデバッグ用コードを加えます。-g をつけて生成したパーサで
45
+ @yydebug を true にセットすると、デバッグ用のコードが出力されます。<br>
46
+ -g をつけるだけでは何もおこりませんので注意してください。
47
+ </dd>
48
+ <dt>-E, --embedded
49
+ <dd>
50
+ ランタイムルーチンをすべて含んだコードを生成します。
51
+ つまり、このオプションをつけて生成したコードは Ruby さえあれば動きます。
52
+ </dd>
53
+ <dt>-C, --check-only
54
+ <dd>
55
+ (文法ファイルの) 文法のチェックだけをして終了します。
56
+ </dd>
57
+ <dt>-S, --output-status
58
+ <dd>
59
+ 進行状況を逐一報告します。
60
+ </dd>
61
+ <dt>-l, --no-line-convert
62
+ <dd>
63
+ <p>
64
+ Ruby では例外が発生した時のファイル名や行番号を表示してくれますが、
65
+ Racc の生成したパーサは、デフォルトではこの場合のファイル名・行番号を
66
+ 文法ファイルでのものに置きかえます。このフラグはその機能をオフにします。
67
+ </p>
68
+ <p>
69
+ ruby 1.4.3 以前のバージョンではバグのために定数の参照に失敗する
70
+ 場合があるので、定数参照に関してなにかおかしいことがおこったらこのフラグを
71
+ 試してみてください。
72
+ </p>
73
+ </dd>
74
+ <dt>-c, --line-convert-all
75
+ <dd>
76
+ アクションと inner に加え header footer の行番号も変換します。
77
+ header と footer がつながっているような場合には使わないでください。
78
+ <dt>-a, --no-omit-actions
79
+ <dd>
80
+ 全てのアクションに対応するメソッド定義と呼び出しを行います。
81
+ 例えアクションが省略されていても空のメソッドを生成します。
82
+ </dd>
83
+ <dt>--version
84
+ <dd>
85
+ Racc のバージョンを出力して終了します。
86
+ </dd>
87
+ <dt>--copyright
88
+ <dd>
89
+ 著作権表示を出力して終了します。
90
+ <dt>--help
91
+ <dd>
92
+ オプションの簡単な説明を出力して終了します。
93
+ </dd>
94
+ </dl>
@@ -0,0 +1,36 @@
1
+ = パーサのデバッグ
2
+
3
+ ここでは、Racc を使っていくうえで遭遇しそうな問題について書きます。
4
+
5
+ == 文法ファイルがパースエラーになる
6
+
7
+ エラーメッセージに出ている行番号のあたりを見て間違いを
8
+ 探してください。ブロックを閉じる行でエラーになる場合は、
9
+ どこかで開き括弧などを増やしてしまっている可能性が高いです。
10
+
11
+ == なんたら conflict って言われた
12
+
13
+ 一番ありがちで一番面倒な問題は衝突 (conflict) でしょう。
14
+ 文法中に衝突があると、racc はコンパイル後に
15
+ 「5 shift/reduce conflict」のようなメッセージを表示します。
16
+ -v をつけると出力される .output ファイルからはさらに詳しい情報が得られます。
17
+ それをどう使うか、とかそういうことに関しては、それなりの本を読んでください。
18
+ とてもここに書けるような単純な話ではありません。
19
+ 当然ながら『Ruby を 256 倍使うための本 無道編』(青木峰郎著)がお勧めです。
20
+
21
+ == パーサは問題なく生成できたけど予想どおりに動かない
22
+
23
+ racc に -g オプションをつけてパーサを出力すると、デバッグ用のコードが
24
+ 付加されます。ここで、パーサクラスのインスタンス変数 @yydebug を true に
25
+ しておいてから do_parse/yyparse を呼ぶと、デバッグ用メッセージが出力
26
+ されます。パーサが動作する様子が直接見えますので、完全に現在の状態を
27
+ 把握できます。これを見てどこがおかしいのかわかったらあとは直すだけ。
28
+
29
+ == next_token に関して
30
+
31
+ いまだ自分でも忘れることが多いのが
32
+ 「送るトークンが尽きたら [false,なにか] を送る」ということです。
33
+ ちなみに Racc 0.10.2 以降では一度 [false,なにか] を受け取ったら
34
+ それ以上 next_token は呼ばないことが保証されています。
35
+
36
+ 追記: 最近は [false,なにか] ではなく nil でもよいことになった。
@@ -0,0 +1,348 @@
1
+ = 規則ファイル文法リファレンス
2
+
3
+ == 文法に関する前バージョンとの非互換
4
+
5
+ * (1.2.5) ユーザーコードを連結する時、外部ファイルよりも
6
+ 埋めこんであるコードを先に連結します。
7
+ * (1.1.6) 新しいディレクティブ options が追加されました。
8
+ * (1.1.5) 予約語 token の意味が変更になりました。
9
+ * (0.14) ルールの最後のセミコロンが省略可能になりました。
10
+ また、token prechigh などが予約語でなくなりました。
11
+ * (10.2) prepare が header に driver が footer になりました。
12
+ 今はそのままでも使えますが、2.0 からは対応しません。
13
+ * (0.10) class に対応する end がなくなりました。
14
+ * (0.9) ダサダサのピリオド方式をやめて { と } で囲むようにしました。
15
+
16
+ == 全体の構造
17
+
18
+ トップレベルは、規則部とユーザーコード部に分けられます。
19
+ ユーザーコード部はクラス定義の後に来なければいけません。
20
+
21
+ === コメント
22
+
23
+ 文法ファイルには、一部例外を除いて、ほとんどどこにでもコメントを
24
+ 書くことができます。コメントは、Rubyの #.....(行末) スタイルと、
25
+ Cの /*......*/ スタイルを使うことができます。
26
+
27
+ === 規則部
28
+
29
+ 規則部は以下のような形をしています。
30
+ --
31
+ class クラス名 [< スーパークラス]
32
+ [演算子順位]
33
+ [トークン宣言]
34
+ [オプション]
35
+ [expect]
36
+ [トークンシンボル値おきかえ]
37
+ [スタート規則]
38
+ rule
39
+ 文法記述
40
+ --
41
+ "クラス名"はここで定義するパーサクラスの名前です。
42
+ これはそのままRubyのクラス名になります。
43
+
44
+ また M::C のように「::」を使った名前を使うと、クラス定義を
45
+ モジュール M の中にネストさせます。つまり class M::C ならば
46
+ --
47
+ module M
48
+ class C < Racc::Parser
49
+ いろいろ
50
+ end
51
+ end
52
+ --
53
+ のように出力します。
54
+
55
+ さらに、Ruby と同じ構文でスーパークラスを指定できます。
56
+ ただしこの指定をするとパーサの動作に重大な影響を与えるので、
57
+ 特に必要がない限り指定してはいけません。これは将来の拡張の
58
+ ために用意したもので、現在指定する必然性はあまりありません。
59
+
60
+ === 文法の記述
61
+
62
+ racc で生成するパーサが理解できる文法を記述します。
63
+ 文法は、予約語 rule と end の間に、以下のような書式で書きます。
64
+ --
65
+ トークン: トークンの並び アクション
66
+
67
+ トークン: トークンの並び アクション
68
+ | トークンの並び アクション
69
+ | トークンの並び アクション
70
+ (必要なだけ同じようにつづける)
71
+ --
72
+ アクションは { } で囲みます。アクションでは Ruby の文はほとんど
73
+ 使えますが、一部だけは非対応です。対応していないものは以下のとおり。
74
+
75
+ * ヒアドキュメント
76
+ * =begin ... =end 型コメント
77
+ * スペースで始まる正規表現
78
+ * ごくまれに % の演算。普通に演算子のまわりにスペースを入れていれば問題なし
79
+
80
+ このあたりに関しては完全な対応はまず無理です。あきらめてください。
81
+
82
+ 左辺の値($$)は、オプションによって返し方がかわります。まずデフォルトでは
83
+ ローカル変数 result (そのデフォルト値は val[0])が 左辺値を表し、アクション
84
+ ブロックを抜けた時の result の値が左辺値になります。または明示的に return
85
+ で返した場合もこの値になります。一方、options で no_result_var を指定した
86
+ 場合、左辺値はアクションブロックの最後の文の値になります (Ruby のメソッドと
87
+ 同じ)。
88
+
89
+ どちらの場合でもアクションは省略でき、省略した場合の左辺値は常に val[0] です。
90
+
91
+ 以下に文法記述の全体の例をしめします。
92
+ --
93
+ rule
94
+ goal: def ruls source
95
+ {
96
+ result = val
97
+ }
98
+
99
+ def : /* none */
100
+ {
101
+ result = []
102
+ }
103
+ | def startdesig
104
+ {
105
+ result[0] = val[1]
106
+ }
107
+ | def
108
+ precrule # これは上の行の続き
109
+ {
110
+ result[1] = val[1]
111
+ }
112
+ (略)
113
+ --
114
+ アクション内では特別な意味をもった変数がいくつか使えます。
115
+ そのような変数を以下に示します。括弧の中は yacc での表記です。
116
+
117
+ * result ($$)
118
+
119
+ 左辺の値。初期値は val[0] です。
120
+
121
+ * val ($1,$2,$3…)
122
+
123
+ 右辺の記号の値の配列。Ruby の配列なので当然インデックスはゼロから始まります。
124
+ この配列は毎回作られるので自由に変更したり捨てたりして構いません。
125
+
126
+ * _values (...,$-2,$-1,$0)
127
+
128
+ 値スタック。Racc コアが使っているオブジェクトがそのまま渡されます。
129
+ この変数の意味がわかる人以外は<em>絶対に</em>変更してはいけません。
130
+
131
+ またアクションの特別な形式に、埋めこみアクションというものがあります。
132
+ これはトークン列の途中の好きなところに記述することができます。
133
+ 以下に埋めこみアクションの例を示します。
134
+ --
135
+ target: A B { puts 'test test' } C D { normal action }
136
+ --
137
+ このように記述すると A B を検出した時点で puts が実行されます。
138
+ また、埋めこみアクションはそれ自体が値を持ちます。つまり、以下の例において
139
+ --
140
+ target: A { result = 1 } B { p val[1] }
141
+ --
142
+ 最後にある p val[1] は埋めこみアクションの値 1 を表示します。
143
+ B の値ではありません。
144
+
145
+ 意味的には、埋めこみアクションは空の規則を持つ非終端記号を追加することと
146
+ 全く同じ働きをします。つまり、上の例は次のコードと完全に同じ意味です。
147
+ --
148
+ target : A nonterm B { p val[1] }
149
+ nonterm : /* 空の規則 */ { result = 1 }
150
+ --
151
+
152
+ === 演算子優先順位
153
+
154
+ あるトークン上でシフト・還元衝突がおこったとき、そのトークンに
155
+ 演算子優先順位が設定してあると衝突を解消できる場合があります。
156
+ そのようなものとして特に有名なのは数式の演算子と if...else 構文です。
157
+
158
+ 優先順位で解決できる文法は、うまく文法をくみかえてやれば
159
+ 優先順位なしでも同じ効果を得ることができます。しかしたいていの
160
+ 場合は優先順位を設定して解決するほうが文法を簡単にできます。
161
+
162
+ シフト・還元衝突がおこったとき、Racc はまずその規則に順位が設定
163
+ されているか調べます。規則の順位は、その規則で一番うしろにある
164
+ 終端トークンの優先順位です。たとえば
165
+ --
166
+ target: TERM_A nonterm_a TERM_B nonterm_b
167
+ --
168
+ のような規則の順位はTERM_Bの優先順位になります。もしTERM_Bに
169
+ 優先順位が設定されていなかったら、優先順位で衝突を解決することは
170
+ できないと判断し、「Shift/Reduce conflict」を報告します。
171
+
172
+ 演算子の優先順位はつぎのように書いて定義します。
173
+ --
174
+ prechigh
175
+ nonassoc PLUSPLUS
176
+ left MULTI DEVIDE
177
+ left PLUS MINUS
178
+ right '='
179
+ preclow
180
+ --
181
+ prechigh に近い行にあるほど優先順位の高いトークンです。上下をまるごと
182
+ さかさまにして preclow...prechigh の順番に書くこともできます。left
183
+ などは必ず行の最初になければいけません。
184
+
185
+ left right nonassoc はそれぞれ「結合性」を表します。結合性によって、
186
+ 同じ順位の演算子の規則が衝突した場合にシフト還元のどちらをとるかが
187
+ 決まります。たとえば
188
+ --
189
+ a - b - c
190
+ --
191
+
192
+ --
193
+ (a - b) - c
194
+ --
195
+ になるのが左結合 (left) です。四則演算は普通これです。
196
+ 一方
197
+ --
198
+ a - (b - c)
199
+ --
200
+ になるのが右結合 (right) です。代入のクオートは普通 right です。
201
+ またこのように演算子が重なるのはエラーである場合、非結合 (nonassoc) です。
202
+ C 言語の ++ や単項のマイナスなどがこれにあたります。
203
+
204
+ ところで、説明したとおり通常は還元する規則の最後のトークンが順位を
205
+ 決めるのですが、ある規則に限ってそのトークンとは違う順位にしたいことも
206
+ あります。例えば符号反転のマイナスは引き算のマイナスより順位を高く
207
+ しないといけません。このような場合 yacc では %prec を使います。
208
+ racc ではイコール記号を使って同じことをできます。
209
+ --
210
+ prechigh
211
+ nonassoc UMINUS
212
+ left '*' '/'
213
+ left '+' '-'
214
+ preclow
215
+ (略)
216
+ exp: exp '*' exp
217
+ | exp '-' exp
218
+ | '-' exp = UMINUS # ここだけ順位を上げる
219
+ --
220
+ このように記述すると、'-' exp の規則の順位が UMINUS の順位になります。
221
+ こうすることで符号反転の '-' は '*' よりも順位が高くなるので、
222
+ 意図どおりになります。
223
+
224
+ === トークン宣言
225
+
226
+ トークン(終端記号)のつづりを間違えるというのはよくあることですが、
227
+ 発見するのはなかなか難しいものです。1.1.5 からはトークンを明示的に
228
+ 宣言することで、宣言にないトークン / 宣言にだけあるトークンに対して
229
+ 警告が出るようになりました。yacc の %token と似ていますが最大の違いは
230
+ racc では必須ではなく、しかもエラーにならず警告だけ、という点です。
231
+
232
+ トークン宣言は以下のように書きます。
233
+ --
234
+ token A B C D
235
+ E F G H
236
+ --
237
+ トークンのリストを複数行にわたって書けることに注目してください。
238
+ racc では一般に「予約語」は行の先頭に来た時だけ予約語とみなされるので
239
+ prechigh などもシンボルとして使えます。ただし深淵な理由から end だけは
240
+ どうやっても予約語になってしまいます。
241
+
242
+ === オプション
243
+
244
+ racc のコマンドラインオプションの一部をファイル中にデフォルト値
245
+ として記述することができます。
246
+ --
247
+ options オプション オプション …
248
+ --
249
+ 現在ここで使えるのは
250
+
251
+ * omit_action_call
252
+
253
+ 空のアクション呼び出しを省略する
254
+
255
+ * result_var
256
+
257
+ 変数 result を使う
258
+
259
+ です。
260
+ それぞれ no_ を頭につけることで意味を反転できます。
261
+
262
+ === expect
263
+
264
+ 実用になるパーサはたいてい無害な shift/reduce conflict を含みます。
265
+ しかし文法ファイルを書いた本人はそれを知っているからいいですが、
266
+ ユーザが文法ファイルを処理した時に「conflict」と表示されたら
267
+ 不安に思うでしょう。そのような場合、以下のように書いておくと
268
+ shift/reduce conflict のメッセージを抑制できます。
269
+ --
270
+ expect 3
271
+ --
272
+ この場合 shift/reduce conflict はぴったり三つでなければいけません。
273
+ 三つでない場合はやはり表示が出ます (ゼロでも出ます)。
274
+ また reduce/reduce conflict の表示は抑制できません。
275
+
276
+ === トークンシンボル値の変更
277
+
278
+ トークンシンボルを表す値は、デフォルトでは
279
+
280
+ * 文法中、引用符でかこまれていないもの (RULEとかXENDとか)
281
+ →その名前の文字列を intern して得られるシンボル (1.4 では Fixnum)
282
+ * 引用符でかこまれているもの(':'とか'.'とか)
283
+ →その文字列そのまま
284
+
285
+ となっていますが、たとえば他の形式のスキャナがすでに存在する場合などは、
286
+ これにあわせなければならず、このままでは不便です。このような場合には、
287
+ convert 節を加えることで、トークンシンボルを表す値を変えることができます。
288
+ 以下がその例です。
289
+ --
290
+ convert
291
+ PLUS 'PlusClass' #→ PlusClass
292
+ MIN 'MinusClass' #→ MinusClass
293
+ end
294
+ --
295
+ デフォルトではトークンシンボル PLUS に対してはトークンシンボル値は
296
+ :PLUS ですが、上のような記述がある場合は PlusClass になります。
297
+ 変換後の値は false・nil 以外ならなんでも使えます。
298
+
299
+ 変換後の値として文字列を使うときは、次のように引用符を重ねる必要があります。
300
+ --
301
+ convert
302
+ PLUS '"plus"' #→ "plus"
303
+ end
304
+ --
305
+ また、「'」を使っても生成された Ruby のコード上では「"」になるので
306
+ 注意してください。バックスラッシュによるクオートは有効ですが、バック
307
+ スラッシュは消えずにそのまま残ります。
308
+ --
309
+ PLUS '"plus\n"' #→ "plus\n"
310
+ MIN "\"minus#{val}\"" #→ \"minus#{val}\"
311
+ --
312
+
313
+ === スタート規則
314
+
315
+ パーサをつくるためには、どの規則が「最初の」規則か、ということを Racc におしえて
316
+ やらなければいけません。それを明示的に書くのがスタート規則です。スタート規則は
317
+ 次のように書きます。
318
+ --
319
+ start real_target
320
+ --
321
+ start は行の最初にこなければいけません。このように書くと、ファイルで
322
+ 一番最初に出てくる real_target の規則をスタート規則として使います。
323
+ 省略した場合は、ファイルの最初の規則がスタート規則になります。普通は
324
+ 最初の規則を一番上にかくほうが書きやすく、わかりやすくなりますから、
325
+ この記法はあまりつかう必要はないでしょう。
326
+
327
+ === ユーザーコード部
328
+
329
+ ユーザーコードは、パーサクラスが書きこまれるファイルに、
330
+ アクションの他にもコードを含めたい時に使います。このようなものは
331
+ 書きこまれる場所に応じて三つ存在し、パーサクラスの定義の前が
332
+ header、クラスの定義中(の冒頭)が inner、定義の後が footer です。
333
+ ユーザコードとして書いたものは全く手を加えずにそのまま連結されます。
334
+
335
+ ユーザーコード部の書式は以下の通りです。
336
+ --
337
+ ---- 識別子
338
+ ruby の文
339
+ ruby の文
340
+ ruby の文
341
+
342
+ ---- 識別子
343
+ ruby の文
344
+ :
345
+ --
346
+ 行の先頭から四つ以上連続した「-」(マイナス)があるとユーザーコードと
347
+ みなされます。識別子は一つの単語で、そのあとには「=」以外なら何を
348
+ 書いてもかまいません。