「コンパイラ・スクリプトエンジン」相談室16 (648レス)
「コンパイラ・スクリプトエンジン」相談室16 http://mevius.5ch.net/test/read.cgi/tech/1405822579/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
117: デフォルトの名無しさん [sage] 2014/12/04(木) 17:14:51.41 ID:hjxCxC4V スレ立てるまでもない質問はここで 139匹目から来ました。 JavaCCで負の数と引き算を識別したいんですけど、どう定義したらいいでしょうか? 以下現状の一部抜粋(メソッド名についてはスルーしてください) void enzan3() : {} { enzan4()((<TASU>|<HIKU>)right=enzan4())* } void enzan4() : {} { enzan5()((<KAKERU>|<WARU>)enzan5())* } void enzan5() : {} { <MOZI>|[<HIKU>]<SUUZI>|"(" e=enzan3() ")" } http://mevius.5ch.net/test/read.cgi/tech/1405822579/117
118: デフォルトの名無しさん [sage] 2014/12/04(木) 18:52:41.09 ID:jHjIGczB >>117 そのスレの997以降のはやってないの? number=0..9 plus::=<expr> + <expr> minus::=<expr> - <expr> expr::=<number>|<plus>|<minus> な感じになるだろうし 単項のマイナスはexprにかからない形式で-が出てきた時だし間違いようがなさそうに思うんだけど http://mevius.5ch.net/test/read.cgi/tech/1405822579/118
123: 117 [sage] 2014/12/06(土) 23:05:55.88 ID:BPhK2Nlg >>120 >みんなBNFとかやってるのか JavaCCの場合字句解析でトークン列に分解してくれて、 >>117にあるようにそのトークンの並びを書いて構文解析の定義をします。 なのでBNF記法とは違った書き方になります。 >>121 >演算子の優先順位はどうしてんの? いい説明文が思い浮かばないので、 まずは例として1+2*3/4-5という式を構文木にしたものを以下にアップします。 http://fast-uploader.com/file/6973429321730/ こんなかんじのまとまりです。 演算子:/ 左辺:3(enzan5) 右辺:4(enzan5) → ?(enzan4) 演算子:* 左辺:2(enzan5) 右辺:?(enzan4) → ?(enzan4) 演算子:- 左辺:?(enzan4) 右辺:5(enzan5) → ?(enzan4) 演算子:+ 左辺:1(enzan5) 右辺:?(enzan4) →?(enzan3) http://mevius.5ch.net/test/read.cgi/tech/1405822579/123
124: 117 [sage] 2014/12/06(土) 23:06:51.00 ID:BPhK2Nlg とりあえずenzan3の定義の先頭にマイナスの記号があるかもしれないという意味合いで 以下のようなコードに変えてみました。 void enzan3() : {} { [<HIKU>]enzan4() //★ ((<TASU>|<HIKU>)enzan4())* } void enzan4() : {} { enzan5() ((<KAKERU>|<WARU>)enzan5() } void enzan5() : {} { <MOZI>|<SUUZI>|"(" enzan3() ")" } <>:トークン |:左右のどちらかの構文(||やOr演算子のようなもの) []:省略可能構文 http://mevius.5ch.net/test/read.cgi/tech/1405822579/124
125: 117 [sage] 2014/12/06(土) 23:07:27.16 ID:BPhK2Nlg すると、以下のような警告が出ました。 Warning: Choice conflict in (...)* construct at line 608, column 9. Expansion nested within construct and expansion following construct have common prefixes, one of which is: <HIKU> Consider using a lookahead of 2 or more for nested expansion. 内容は選択の突出(Choice conflict)と言うもので、 私が作った構文の定義があいまいのようで 608行目(ここでは★を付けた行)の定義が他の定義とかぶっているらしく、 先頭に出てくる<HIKU>トークンが共通点らしいです。 そもそもの考え方が間違っているかもしれませんが、 それを抜きにしてもまずなぜこのような警告が出ているかわかりません。 一体なぜ出ているかわかる人いれば教えてださい。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/125
130: 117 [sage] 2014/12/07(日) 21:58:06.68 ID:OacxF8nB >>127 選択の衝突でしたね。 間違えて覚えました; かぶってるらしいからLOOKAHEADで先読みをしなくてはならないのはわかるのですが、 そのコードでどのパターンとどのパターンでかぶってるのかがわからなくて。 >>128 >-(1+2)とか、1+(-2)とかにその定義で対応できる? 1+(-2)のパターンは意識していましたが、-(1+2)のパターンは忘れてました。 きちんと考えなおしてきます。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/130
132: 117 [sage] 2014/12/08(月) 00:25:52.66 ID:yQ2quuvD いろいろ考えているうちに構文規則がおかしなことになってきました; とりあえず負の数やかっこを含む数式の構文木を一通り考えてみたつもりなんですけど、 以下のような感じであっているでしょうか? http://fast-uploader.com/file/6973521373227/ また、他に欠けているパターンはないでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1405822579/132
134: 117 [sage] 2014/12/08(月) 21:29:48.11 ID:yQ2quuvD >>133 あれは構文木と言うより抽象構文木というか内部構造と言うかそんなかんじのものですね; 負の数をどう計算するか考えてたらその式や数字に-1をかければいいかなと思って作ってました。 今度はきちんと抽象じゃない構文木を考えます。 はい。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/134
135: 117 [sage] 2014/12/08(月) 23:27:15.44 ID:yQ2quuvD とりあえず自分がわかっている範囲で -(1+2)*4 の解析木を作ってみました。 http://fast-uploader.com/file/6973604307310/ enzan番号という名前はやめてみました。 空欄部分は下位置調節のためや何を入れたらいいかわからない部分です。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/135
136: 117 [sage] 2014/12/09(火) 21:43:09.57 ID:KYZ3f1RL 構文規則作ってみましたが、選択の衝突が消えません。 tasuhikuのkakewaruをkakewaru2に変えると消えます。 kakewaruで呼んでるminusの[<HIKU>]がtasuhikuの<HIKU>と競合しているのかと思いましたが、 なぜなのかわかりません。 どこが間違っているでしょうか? 警告なのでとりあえず無視してjavacコンパイルして解析&実行させてみると、以下の式はきちんと実行できました。 1+2+3 -9-3 1+2*3/4-5 7+(-2) -6*2 -(1+2)*4 (-1+2)*4 -1+2*4 4-(-2/5) -(-(-39))/13 一応ある程度のパターンを網羅していると思います。 Warning: Choice conflict in (...)* construct at line 608, column 9. Expansion nested within construct and expansion following construct have common prefixes, one of which is: <HIKU> Consider using a lookahead of 2 or more for nested expansion. http://mevius.5ch.net/test/read.cgi/tech/1405822579/136
137: 117 [sage] 2014/12/09(火) 21:44:56.07 ID:KYZ3f1RL void tasuhiku(): {} { kakewaru() //608行目 ((<TASU>|<HIKU>)kakewaru2())* } void kakewaru(): {} { minus() ((<KAKERU>|<WARU>)sikikakko())* } void kakewaru2(): {} { sikikakko() ((<KAKERU>|<WARU>)sikikakko())* } http://mevius.5ch.net/test/read.cgi/tech/1405822579/137
138: 117 [sage] 2014/12/09(火) 21:45:41.74 ID:KYZ3f1RL void minus(): {} { [<HIKU>]sikikakko() } void sikikakko(): {} { ("(" tasuhiku() ")" |atai()) } void atai(): {} { <SUUZI> } http://mevius.5ch.net/test/read.cgi/tech/1405822579/138
142: 117 [sage] 2014/12/10(水) 16:50:00.17 ID:pQyEQrGQ >>139 私のことだったら荒らそうと言うつもりは全くありません。 でも荒らしに見えてしまっていたならすいません。 >>140-141 ドラゴンブックってこれのことですかね? http://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E2%80%95%E5%8E%9F%E7%90%86%E3%83%BB%E6%8A%80%E6%B3%95%E3%83%BB%E3%83%84%E3%83%BC%E3%83%AB-Information-Computing-A-V-%E3%82%A8%E3%82%A4%E3%83%9B/dp/478191229X (私にとって)安くないですし今そこから勉強している余裕はないので・・・。 すいません。 よそでパーサジェネレータ使った方がいいとか言われて、 Javaが好きなどの理由でJavaCCを使うようになりました。 なんにせよ周りに作ったことある人とかいないので、 http://www.sbcr.jp/products/4797337958.html とか http://item.rakuten.co.jp/books-sanseido/ebm-techno03/ とか片手に独学でやってます。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/142
146: 117 [sage] 2014/12/10(水) 21:46:27.74 ID:pQyEQrGQ >>143 >「JavaCCを使えば知識がなくてもこんなに簡単」的なことを書く人は そこまで言われたことはないです。 一番最初は文字列を自分で解析するところからやろうとしてましたけど、 パーサジェネレータを知ってからわたしにとってはそっちの方が楽だと感じています。 ここで質問したこと以外でも詰まったりもしましたけども、 もし構文解析ツールを1から作っていたらきっとここまでたどり着くまでにもっと詰まっていると思います。 >>144 すいません。 実はこれ卒業研究なので・・・。 自分で作ってみたい→卒研のテーマに悪くないよね? な感じで決めてしまったテーマです。 >>145 連投とかしすぎましたかね・・・; http://mevius.5ch.net/test/read.cgi/tech/1405822579/146
151: 117 [sage] 2014/12/10(水) 23:23:29.27 ID:pQyEQrGQ >>147 Javaの研究室ではありますけど、先生は構文解析などの経験はないそうなので・・・。 ゼミのときに負の数と引き算の問題も一応聞いてみたんですけど、 残念ながら大したアドバイスをもらえませんでした。 ちなみに、研究室ではネットワーク関連のことやってる人が多いです。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/151
155: 117 [sage] 2014/12/11(木) 00:04:58.83 ID:TxaNdaYp >>148 >>150 すいません・・・。 >>149 >>152 "こういうところが新しいです" と言える自信はありません・・・。 すいません。 一番の理由は"自分で作ってみたい"と思ったからです。 あと、先生に止められることもなかったですし。 構文解析が目的と言うよりは、半分ノリで付けてしまったテーマが 「初めでも使いやすい日本語で書けるプログラミング言語を作る」 なんてテーマです。 "日本語なら初めてでもとっつきやすいかな?"なんて安易な考えで 「初めてでも」なんてつけて付けてしまいました。 構文を考える上で自分で後悔してたりします; >>153 文法を考えるのも構文規則を作るのも楽なものではないと思ってます。 それよりも構文解析器を作るほうが難しそうと感じてしまっているのは事実です。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/155
158: 117 [sage] 2014/12/11(木) 07:22:36.95 ID:TxaNdaYp >>156 プログラミングの棚にはなかったと思うんですけど、 とりあえず今日大学の図書館探してみます。 「ふつうのコンパイラをつくろう」の方は図書館にも置いてあったので。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/158
160: 117 [sage] 2014/12/11(木) 17:45:33.30 ID:TxaNdaYp ドラゴンブックは残念ながら大学の図書館にはありませんでしたが、 市内(他区)の図書館にはあるとのことなので取り寄せて読みます。 1万円ほどの本を買うには残念ながらお金がないもので・・・; 他に大学にあった以下のコンパイルの本び中でおすすめってありますか? コンパイラの基礎 / 徳田雄洋著 命令レベル並列処理 : プロセッサアーキテクチャとコンパイラ / 安藤秀樹著 コンパイラ入門 : 文法から設計・製作まで / 小田一博著 Cコンパイラ設計 : yacc/lexの応用 / A.T.シュライナー,H.G.フリードマン 著 ; 矢吹道郎 〔ほか〕訳 超並列処理コンパイラ / 村岡洋一著 コンパイラ / 疋田輝雄 著 DIANA入門/言語仕様/応用 : Adaコンパイラ実現のための中間言語 やさしいコンパイラの作り方 / 中西正和 共著 ; 大野義夫 共著 新言語作成の技法 : オリジナル・コンパイラ / 大貫広幸 著 N88日本語BASIC(86)コンパイラ活用法 : Personal computer MS-DOS版 / 肥田野登 著 コンパイラの技法 / 中田育男 著 コンパイラのうちとそと / 島内剛一ほか共著 コンパイラの設計と構築 / Arthur B.Pyster 著 ; 松尾正信 訳 コンパイラの技法 / F.R.A.ホップグッド著 ; 首藤勝, 関本彰次共訳 コンパイラ構成法 / 原田賢一著 コンパイラ : プログラム言語処理の基礎 / 井上謙蔵著 コンパイラ設計技法 : 理論と実践 / T. ピットマン, J. ピーターズ著 ; 今泉貴史訳 dBASE ・ PLUSコンパイラ & アセンブラ ゜ / 桑村幸雄,池端良一 著. -- 2版 コンパイラ・コンパイラ / 井上謙蔵著. -- 産業図書, 1970. Let's C(Ver3.0)プログラミングハンドブック : MS-DOS用Cコンパイラ / PMC研究所 編 やさしいコンパイラの作り方 / 中西正和,大野義夫 共著 Microsoft QuickC コンパイラ Ver.2.0 ランタイム ライブラリ リファレンス コンパイラ作成の技法 / David Gries著 ; 牛島和夫訳 コンパイラ / 中田育男著 http://mevius.5ch.net/test/read.cgi/tech/1405822579/160
169: 117 [sage] 2014/12/11(木) 21:35:13.25 ID:TxaNdaYp >>161 >文芸的なcobol+日本語ななでしこ? cobolやなでしこは使ったことないのでわかりませんが、 私は英語を用いた言語よりはわかりやすいと思います。 コメント文での説明が要らないかどうかは作るものによりますけど。 >あるなら手にとって読んでみればいいのに いろんな図書館に点々としてるそうで、 中にはどこにあるのかわからない図書館にある本だったりも・・・; ちなみに、上げた24冊のうち私の工学部の校舎にある図書館に絞ると3冊しかないそうです。 >>162 >>164 中田先生の本読んでみます。 ドラゴンブックの方も取り寄せが届いたら読みます。 >>167 面白いならその2冊も読んでみます。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/169
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.024s