1 名前:デフォルトの名無しさん mailto:sage [2014/07/20(日) 11:16:19.37 ID:p6eMVAxc.net] プログラミング言語処理系の開発に興味のある人達のスレッドです。 字句解析・構文解析から,データフロー解析,ループ並列化,データ分散,SSA変換, CPS変換,レジスタ割付,命令スケジューリング,ソフトウェアパイプライン, SIMD命令生成,VLIW向けクラスタリング,スクラッチメモリ向け最適化,リンク時最適化, JIT,動的バイナリ変換等の各種最適化,それにVM,GC,低消費電力化などなど。 意味論に関する話題も歓迎です。 Wikiのまとめページ www6.atwiki.jp/compilerandscriptengine/
52 名前:デフォルトの名無しさん mailto:sage [2014/10/20(月) 07:07:45.12 ID:vNvY5rmm.net] ある海外のファンタジー小説で、異世界召喚されたプログラマが魔法でFORTHを実装して 最強魔導師になってた。
53 名前:デフォルトの名無しさん mailto:sage [2014/10/20(月) 07:26:17.53 ID:fcKonDPy.net] May the forth be with you.
54 名前:デフォルトの名無しさん mailto:sage [2014/10/20(月) 11:16:47.94 ID:6/LNQkyp.net] Lispは見た目的に「目にひっかからない」(関数もマクロもみんな同じようにしか見えない)のが問題なんだけど、 最近流行ってる(?)みたいに ( ) と [ ] を使い分けるとかすると、だいぶ感じが違うと思う。
55 名前:デフォルトの名無しさん mailto:sage [2014/10/20(月) 16:23:26.53 ID:s/tFnXbk.net] >>52 Clojureが凄い良くできてる ()でリスト,[]でベクタ,{}でマップ、#{}でセットとリテラルの扱いが凄い綺麗
56 名前:デフォルトの名無しさん mailto:sage [2014/10/25(土) 10:10:07.27 ID:9gGhLYaB.net] {} はすごくいいね。素の lisp だとほとんど使われない記号でもったいなかった。しかも数式とも合ってる。 ただ[] は好きになれないなぁ。個人的趣味だけど。
57 名前:デフォルトの名無しさん mailto:sage [2014/10/25(土) 13:15:04.28 ID:rVCkRMh+.net] 変わった趣味だw
58 名前:デフォルトの名無しさん mailto:sage [2014/11/01(土) 16:34:43.21 ID:5yNYNAVX.net] エラーメッセージを楽して、素晴らしく表示したいんですけど いい方法を教えてください。
59 名前:デフォルトの名無しさん mailto:sage [2014/11/01(土) 18:28:37.68 ID:yfMW+WpF.net] >>56 センスのいい奴に頼む
60 名前:デフォルトの名無しさん mailto:sage [2014/11/01(土) 19:12:18.30 ID:md1XyPQH.net] 言うても行桁理由以外に何か必要かね
61 名前:デフォルトの名無しさん mailto:sage [2014/11/01(土) 19:25:31.66 ID:etXlBO/A.net] ファイル名…かな
62 名前:デフォルトの名無しさん mailto:sage [2014/11/01(土) 20:57:55.11 ID:68QCuiUg.net] エラー表示は?だけでいい というネタがあったな
63 名前:デフォルトの名無しさん mailto:sage [2014/11/02(日) 00:04:36.51 ID:FPvqJpqA.net] 人間が見てるのとコンパイラが解釈してるので大きくズレがある場合とか エラーメッセージ見てわからんことが多々ある xxの前にxxがあります/ありません系のエラーはウンザリ
64 名前:デフォルトの名無しさん mailto:sage [2014/11/02(日) 00:22:55.85 ID:E/aMB+tP.net] print " _人人 人人_ \n", "> 突然の死
65 名前:< ", col, ",", row, " in ",filename,":", reason, "\n", "  ̄Y^Y^Y^Y ̄\n"; die; 楽して素晴らしい方向を考えた [] [ここ壊れてます]
66 名前:デフォルトの名無しさん mailto:sage [2014/11/02(日) 04:19:14.28 ID:l3Xq9EsR.net] $ nmlc -run examples/lablgl/triangle.nml Fatal error: exception Failure(" _人人 人人_ > 突然の死 < parse error line 33  ̄Y^Y^Y^Y^Y ̄ ") って出るようにしてみた。
67 名前:デフォルトの名無しさん mailto:sage [2014/11/02(日) 07:10:13.81 ID:Pf8ySLA3.net] 何のエラーか なぜ起こったか どうすれば良いか のうちどこまでエラー表示するか 表示しないものはマニュアルに書くか 統一しておくと良い
68 名前:デフォルトの名無しさん mailto:sage [2014/11/02(日) 10:22:44.88 ID:P2QTHoYV.net] 何のエラーか数字で提示 あとはknowledge baseで knowledge baseは迷宮
69 名前:デフォルトの名無しさん mailto:sage [2014/11/02(日) 11:43:14.80 ID:6U4Atlhd.net] 基本的には書いた人の頭のエラーだからな。 コンパイラ的には「チェンジ!チェンジ!この子変えて!!!」 だけでいい。
70 名前:デフォルトの名無しさん [2014/11/02(日) 12:31:43.49 ID:4dYx0WR7.net] > 関西型プログラミング言語のひとつ Kyoto のコンパイラは,文法ミスのあるコードを与えると「ふうがわりなコードどすなぁ」とだけ返すので,何が間違っているかはこちらで推測する必要がある.
71 名前:デフォルトの名無しさん mailto:sage [2014/11/02(日) 12:39:13.58 ID:FPvqJpqA.net] 何回も間違ったらぶぶ漬けが出てきそうだな
72 名前:デフォルトの名無しさん mailto:sage [2014/11/02(日) 12:58:18.94 ID:i2BOrYsG.net] >>64 > どうすれば良いか これは余計なお世話だわ
73 名前:デフォルトの名無しさん mailto:sage [2014/11/02(日) 13:03:44.74 ID:FPvqJpqA.net] この道路は工事中なので次の迂回路をご利用ください
74 名前:デフォルトの名無しさん mailto:sage [2014/11/02(日) 16:35:04.02 ID:l3Xq9EsR.net] コンパイル速ければ、エラーは1個で十分だったりするよなぁっとか。 大量に出すなら、一番先頭のエラーを一番下に出すと嬉しいとか。
75 名前:デフォルトの名無しさん mailto:sage [2014/11/03(月) 12:49:03.39 ID:ljM6XCm0.net] >> 70 迂回は出来ないんだなぁ
76 名前:デフォルトの名無しさん mailto:sage [2014/11/03(月) 18:22:08.25 ID:6fFurIEN.net] 最近のghcとかだと、関数名をタイポすると似た存在する関数名を示してくれる。外してる時もあるけど。 ああいう親切さをもっと充実させるのも方向性としてはありだと思う。 あらゆるコンパイルエラーがクラウドサーバに送られ続けて典型的なミスを蓄積し続ける、とかね。
77 名前:デフォルトの名無しさん mailto:sage [2014/11/04(火) 11:17:19.99 ID:bZGUB4M2.net] 大量のデータをまとめて整理した結果をどこかで見たけど よくあるスペルミス・インポート忘れ・宣言忘れが飛び抜けていて それ以外はごくわずかでどうでもいいという印象だった
78 名前:デフォルトの名無しさん mailto:sage [2014/11/04(火) 11:19:32.39 ID:bZGUB4M2.net] 中級者以上と入門者はつまずく所が全く違うから 後者のデータだけを集めれば「入門者に最適」な言語やツールが作れるかもしれない
79 名前:デフォルトの名無しさん mailto:sage [2014/11/04(火) 13:56:57.87 ID:OXvDS9Yh.net] C言語は、研究結果;はあった方が良いみたいな話を聞いた事があるような気がする。 けど、最後だけ無しとかだったのかもしれないし、良く覚えてないなぁ。 今作ってる言語は必要な所だけ;を書くって作ってるのだけど。 初心者には難しいのかもしれないです。
80 名前:デフォルトの名無しさん mailto:sage [2014/11/04(火) 15:36:24.07 ID:bZGUB4M2.net] 気の利いたエディタサポートまで考えるなら改行をまたぐ構文を禁止すべき VBはそうなってる
81 名前:デフォルトの名無しさん mailto:sage [2014/11/04(火) 15:58:19.03 ID:vqrMdBMn.net]
82 名前:lispとかでマクロ展開したときに中でエラーが起こったら行と桁の表示は諦めるしかないのかな 前に作ったとき展開後も展開前の行を引き継ぐやり方をしてたけど [] [ここ壊れてます]
83 名前:デフォルトの名無しさん mailto:sage [2014/11/04(火) 17:04:17.39 ID:99dxtSJ/.net] >>78 トークンに文字列だけじゃなく、もとあった位置の情報も付けたら? >>76 どんな言語でも、ある程度本格的なプロダクトなら、たいてい、「やたら長くなるから改行を挟みたい式」と 「やたら短くて似たようなのが連続するから1行にまとめたい文」の両方が出てくるので、 どちらを強制するのも一長一短。 構文的には (a, b, c, d) と {a; b; c; d;} の、どちらも似たようなものだけど、機械的なコード生成では 後者のほうが以前は楽だった(最近は可変長配列みたいなオブジェクトに入れて、最後に joinとか、ライブラリが充実してる言語を使うのが普通なので、あまり差は無い)。 人間の作業としては、複数行にまたがるものでは前者のほうはちょっとめんどい。 (最後の行を削ったあとで、前の行の最後も削る必要があるので) {a, b, c} みたいに閉じカッコを行末に付けてしまえばそうでもないかもだが。 あとそもそもC言語の構文では ; の規則がちょっと変則的。
84 名前:デフォルトの名無しさん mailto:sage [2014/11/04(火) 23:11:55.77 ID:DC7Ttoit.net] Lispマクロのデバッグはちょっと難しいよな。 backquoteのように構文上の構造を引き継ぐような奴ばかりならいいんだけど。
85 名前:デフォルトの名無しさん mailto:sage [2014/11/04(火) 23:12:32.22 ID:DC7Ttoit.net] デバッグ→デバッグ情報
86 名前:デフォルトの名無しさん mailto:sage [2014/11/04(火) 23:31:17.91 ID:6PskSs9/.net] 複雑なマクロでもたいていは展開系見れば何とかなるね。それでも動かないマクロがたまーにあって辛いけど。
87 名前:デフォルトの名無しさん [2014/11/04(火) 23:40:21.11 ID:cufVHbaO.net] 自作のコンパイラなりなんなりはデバッグと最適化を考えたらなにも出来ない むしろ潔く投げ捨てる勢いと割り切りで走らないとダメっしょ 俺様考えたルールで動いた万歳終わりな感じ 四則演算と条件文、あとGOTOなりCALLなりがあれば立派 それ以上の高度化は努力しだいってことで それとも大人しくCommon Lispあたりを使って妥協するとか Lispだと関数を生成して実行できるんだよね 例えば入力画面の項目数とか要件とかを与えて関数の形で生成して実行な感じの 俺様コンパイラ、Lispコード生成するからコンパイルや実行デバッグはそちらでオネガイみたくw
88 名前:デフォルトの名無しさん mailto:sage [2014/11/05(水) 01:50:49.88 ID:j8mQRcC4.net] そこまで楽するなら構文をリードマクロで定義したほうが早そう
89 名前:デフォルトの名無しさん mailto:sage [2014/11/05(水) 07:49:49.12 ID:xr1YCX3/.net] xmlってスクリプト言語なの?データ構造なの? xmlを使ったスクリプト言語らしきモノもあるみたいだし、よーわからん
90 名前:デフォルトの名無しさん mailto:sage [2014/11/05(水) 08:22:34.79 ID:Fpn6fvq+.net] >>83 C とかのソース吐いて、最適化よろしくね(はーと)でいいだろ
91 名前:デフォルトの名無しさん mailto:sage [2014/11/05(水) 09:54:15.68 ID:gfolKTI3.net] >>85 データ構造だろ パーサ作るのが楽というか有りものが使えるからxxxxMLみたいに拡張して使われるんだろう
92 名前:デフォルトの名無しさん mailto:sage [2014/11/05(水) 11:54:58.98 ID:bBYPRYMe.net] >>85 プレーンテキストってスクリプト言語なの?データ構造なの?
93 名前:デフォルトの名無しさん mailto:sage [2014/11/05(水) 17:03:13.23 ID:I87EWij/.net] >>88 只の文字列だよ そこに意味を付けるのはまた別の事
94 名前:デフォルトの名無しさん mailto:sage [2014/11/05(水) 17:58:10.42 ID:uuXXn0N9.net] シェルスクリプトとかみたいな意味でスクリプトではない。 XSLTとか、あとワドラー氏が冗談で提案していたと思うがXMLで表現するプログラミング言語と いうものもありうるけど、XML自体は単なるデータ構造でしかない。
95 名前:デフォルトの名無しさん mailto:sage [2014/11/05(水) 21:09:37.17 ID:WN8UKbpt.net] XMLにロジックを書く者は呪われる。やめておいた方がいい。あれはデータ形式としても冗長すぎるし、良いところはない。 S式を使うといい。
96 名前:デフォルトの名無しさん mailto:sage [2014/11/05(水) 21:32:19.82 ID:uuXXn0N9.net] XSLTは割とよくできてるよw
97 名前:デフォルトの名無しさん mailto:sage [2014/11/06(木) 01:58:37.08 ID:Rw7wEfhr.net] 閉じ括弧重ね書き文化は誰も止めなかったのかねえ))))))))))))))))))))
98 名前:デフォルトの名無しさん mailto:sage [2014/11/06(木) 02:08:22.53 ID:rrEEAzVB.net] Cみたいな中括弧、改行、インデントを繰り返すのもイマイチ
99 名前:デフォルトの名無しさん mailto:sage [2014/11/07(金) 19:44:15.64 ID:XxPyN8W7.net] 整ってると思うがなあ switch, caseだけはアレだが
100 名前:デフォルトの名無しさん mailto:sage [2014/11/07(金) 20:31:09.14 ID:sXupdHKX.net] switchとcaseは同じインデントにしてbreakだけ字下げだよね?ね?
101 名前:デフォルトの名無しさん mailto:sage [2014/11/07(金) 20:52:59.78 ID:4yd7iQ66.net] >>96 に一票
102 名前:デフォルトの名無しさん mailto:sage [2014/11/07(金) 22:25:11.01 ID:fMVGCDH+.net] (,)は特別な意味持たせたいとかあるので難しいですね。 (a,)はタプルにしようか、タプルじゃないのかとか。(,a)はタプルとか。
103 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 11:22:54.52 ID:/PoG0aeo.net] Pythonの「1要素のタプル」はトリッキーだが面白いとは思った。 kなんとかの人が言ってるように、カッコなしでもそうなるのは罠だがw
104 名前:デフォルトの名無しさん [2014/11/09(日) 12:10:23.68 ID:6nixZySy.net] lispだと(a)とaの違いかな
105 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 16:44:48.42 ID:7O7eobU9.net] >> 100 そんな感じ。名前のない構造体
106 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 20:23:26.03 ID:15ZMIIuR.net] いや名前ある、タプル
107 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 01:34:25.20 ID:zIX5GD/A.net] ここって正規表現エンジンの話もいいのかな nfaとdfaのハイブリッドエンジンを実装したいんだけど dfaの中にnfaがあったらどう処理するかとかどこまでdfaにしていいかとかさっぱり分からない 調べてもon-the-flyという単語ぐらいしか出てこなくて実装方法とかは見つからない 知ってる人いたら教えてほしい
108 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 07:33:01.86 ID:XDoaKxdi.net] schemeの自作コンパイラ作成の過程で、cps変換につまづいています。 よくネット上で「簡単な処理で実現できる」という感じで書いてあるのを良く見るのですが、 実際にやろうとするとなかなかできません。 具体的に何をやったらいいのでしょうか? ちなみにlambdaでのcps変換はぎりぎり理解できてると思います。
109 名前:デフォルトの名無しさん [2014/11/10(月) 09:06:04.50 ID:hP+YfTbo.net] Scheme使ってるならEoPLの最後のほうの章読んだらええで。
110 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 12:08:25.51 ID:s3EMdqhf.net] >>103 つ ドラゴンブック, lazy transiyiOn evaluation 古典実装だとoriginal egrep
111 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 17:06:44.93 ID:G4zfChd8.net] >>100 Lisp の (a) は (a . nil) だからちょっと違う。 >>101 構造体とかそういう別の名前を持ち出したりするとややこしくなるだけ。
112 名前:デフォルトの名無しさん mailto:sage [2014/11/11(火) 02:10:53.26 ID:85SNGvMw.net] >>106 ありがとう でも自分の望んでるのとは違うみたい
113 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 01:44:27.15 ID:DTrQhtqP.net] >>108 この延長線上にある話だと理解できてないか、 SFA(semi-deterministic finite automata)を勘違いしてon-the-flyだと思っている。 前者ならGNU Rxを読めばいい。
114 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 01:57:21.21 ID:/4vNcbkH.net] >>109 多分後者かもしれない 自分の考えてるのは(X)*aときたら 1 ==(X)==> 1 1 ==a==> 2 というdfaを作って次のノードへの遷移条件が文字じゃなくてnfaなら それを優先して見てマッチしたらその先に行く方法を考えてた それならnfaとdfaをうまく組みあわせられると思って あとsfaは今初めて知った sfaとかon-the-flyは調べてもちゃんとした説明が出てこなくて困る
115 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 01:59:11.10 ID:/4vNcbkH.net] あとnfaだけかdfaだけなら偶然持ってたドラゴンブックやネットの情報が十分にあって実装出来た ハイブリッドにする方法が分からなくて途方に暮れてる
116 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 11:39:32.29 ID:b8dDlQST.net] SFAでググったらランク上位の日本語の記述がこれだった www.slideshare.net/mobile/sinya8282/ss-12170832 役に立つかは知らないけどマッチングの並列実行だってさ
117 名前:デフォルトの名無しさん mailto:sage [2014/11/15(土) 04:11:51.30 ID:2wuAQ8Y6.net] DFAで出来ないこと、やると遅いことをNFAでやる。 DFAにならない正規表現の拡張や状態が爆発するn回繰り返しなど。
118 名前:片山博文MZ次期CEO ◆T6xkBnTXz7B0 [2014/11/29(土) 15:46:21.26 ID:AWiICJMh.net] Caperで、Haxe用のパーサーが作れるようになったらしいぞ!!! jonigata.github.io/caper/caper.html
119 名前:デフォルトの名無しさん mailto:sage [2014/11/29(土) 19:24:39.29 ID:bjHueY84.net] ということはjavaとphpとC#に対応したということか
120 名前:デフォルトの名無しさん mailto:sage [2014/11/29(土) 19:25:23.30 ID:bjHueY84.net] って元からしてんじゃん…
121 名前:デフォルトの名無しさん mailto:sage [2014/12/04(木) 17:14:51.41 ID:hjxCxC4V.net] スレ立てるまでもない質問はここで 139匹目から来ました。 JavaCCで負の数と引き算を識別したいんですけど、どう定義したらいいでしょうか? 以下現状の一部抜粋(メソッド名についてはスルーしてください) void enzan3() : {} { enzan4()((<TASU>|<HIKU>)right=enzan4())* } void enzan4() : {} { enzan5()((<KAKERU>|<WARU>)enzan5())* } void enzan5() : {} { <MOZI>|[<HIKU>]<SUUZI>|"(" e=enzan3() ")" }
122 名前:デフォルトの名無しさん mailto:sage [2014/12/04(木) 18:52:41.09 ID:jHjIGczB.net] >>117 そのスレの997以降のはやってないの? number=0..9 plus::=<expr> + <expr> minus::=<expr> - <expr> expr::=<number>|<plus>|<minus> な感じになるだろうし 単項のマイナスはexprにかからない形式で-が出てきた時だし間違いようがなさそうに思うんだけど
123 名前:デフォルトの名無しさん mailto:sage [2014/12/04(木) 20:49:24.04 ID:hjxCxC4V.net] あ。 そこの >単項演算子と二項演算子の区別 についてはまだ調べてないです。 調べてみます。 二項演算子+,-の間に二項演算子*,/を含む式があって、 その中にカッコか数字か変数呼び出しなどがあるように定義するのではないのですか? 例えば -1 1-2 -2*4 2/(-2+5) などの書き方が使えるようになるといいなとか考えています。 >>118 ::=って書き方は確かBNF記法でしたっけ? その書き方についてぜんぜん知らないのでそれも調べてみます。
124 名前:デフォルトの名無しさん mailto:sage [2014/12/06(土) 17:09:31.69 ID:evyQIgPT.net] みんなBNFとかやってるのか char配列にして解析してるから常に最後が';'だと楽なんだよね '{'で+1、'}'で-1、+-0の状態で';'がきたらその構文が完結する int a;, class {}; switch{}; void hey(){}; if(true){}; for(){};
125 名前:デフォルトの名無しさん mailto:sage [2014/12/06(土) 17:17:29.59 ID:djm9MkQZ.net] 演算子の優先順位はどうしてんの?
126 名前:デフォルトの名無しさん mailto:sage [2014/12/06(土) 17:30:21.62 ID:5oGFUyw+.net] べつに区切り文字が = だろうが : だろうが ::= だろうが BNF は BNF だ
127 名前:117 mailto:sage [2014/12/06(土) 23:05:55.88 ID:BPhK2Nlg.net] >>120 >みんなBNFとかやってるのか JavaCCの場合字句解析でトークン列に分解してくれて、 >>117 にあるようにそのトークンの並びを書いて構文解析の定義をします。 なのでBNF記法とは違った書き方になります。 >>121 >演算子の優先順位はどうしてんの? いい説明文が思い浮かばないので、 まずは例として1+2*3/4-5という式を構文木にしたものを以下にアップします。 fast-uploader.com/file/6973429321730/ こんなかんじのまとまりです。 演算子:/ 左辺:3(enzan5) 右辺:4(enzan5) → @(enzan4) 演算子:* 左辺:2(enzan5) 右辺:@(enzan4) → A(enzan4) 演算子:- 左辺:A(enzan4) 右辺:5(enzan5) → B(enzan4) 演算子:+ 左辺:1(enzan5) 右辺:B(enzan4) →C(enzan3)
128 名前:117 mailto:sage [2014/12/06(土) 23:06:51.00 ID:BPhK2Nlg.net] とりあえずenzan3の定義の先頭にマイナスの記号があるかもしれないという意味合いで 以下のようなコードに変えてみました。 void enzan3() : {} { [<HIKU>]enzan4() //★ ((<TASU>|<HIKU>)enzan4())* } void enzan4() : {} { enzan5() ((<KAKERU>|<WARU>)enzan5() } void enzan5() : {} { <MOZI>|<SUUZI>|"(" enzan3() ")" } <>:トークン |:左右のどちらかの構文(||やOr演算子のようなもの) []:省略可能構文
129 名前:117 mailto:sage [2014/12/06(土) 23:07:27.16 ID:BPhK2Nlg.net] すると、以下のような警告が出ました。 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>トークンが共通点らしいです。 そもそもの考え方が間違っているかもしれませんが、 それを抜きにしてもまずなぜこのような警告が出ているかわかりません。 一体なぜ出ているかわかる人いれば教えてださい。
130 名前:デフォルトの名無しさん mailto:sage [2014/12/06(土) 23:08:41.58 ID:q7blqefO.net] >>120 java(というよりC)のforは()の内部に;が出てくるのが >>119 javaccの書き方と大差ないみたいよ
131 名前:デフォルトの名無しさん mailto:sage [2014/12/06(土) 23:27:12.88 ID:5oGFUyw+.net] この文脈でconflictは「衝突」と言う。 そのメッセージの通り、複数の定義で共通してるトークンがあるから、どっちの定義のほうだとして 解釈していいかわからないからエラーになる。 そのメッセージでは「Consider using a lookahead of 2 or more for nested expansion.」2個あるいはそれ以上の 先読みを使うことを検討してみろ、と言っているが、それに従ったところでうまくいくかどうかは わからんけどね。
132 名前:デフォルトの名無しさん mailto:sage [2014/12/07(日) 01:31:54.20 ID:bfkTF4nN.net] >>123 >>121 は重要なヒント -(1+2)とか、1+(-2)とかにその定義で対応できる? たとえば★の行をenzan5に移してみるなり、演算子の優先順位を変えてやりなおすとか それとは関係ないけど、3*2/4って直感的には( (3 * 2) / 4 )になりそうだけどその構文木だと右から左なのね
133 名前:デフォルトの名無しさん mailto:sage [2014/12/07(日) 01:36:47.04 ID:bfkTF4nN.net] >>128 勘違いしたわすれて
134 名前:117 mailto:sage [2014/12/07(日) 21:58:06.68 ID:OacxF8nB.net] >>127 選択の衝突でしたね。 間違えて覚えました; かぶってるらしいからLOOKAHEADで先読みをしなくてはならないのはわかるのですが、 そのコードでどのパターンとどのパターンでかぶってるのかがわからなくて。 >>128 >-(1+2)とか、1+(-2)とかにその定義で対応できる? 1+(-2)のパターンは意識していましたが、-(1+2)のパターンは忘れてました。 きちんと考えなおしてきます。
135 名前:デフォルトの名無しさん mailto:sage [2014/12/07(日) 22:37:16.24 ID:bfkTF4nN.net] >>130 試しに四則演算のみ行う言語をjavaccで作ってみたけど単行演算子程度ならLookAheadいらないよ
136 名前:117 mailto:sage [2014/12/08(月) 00:25:52.66 ID:yQ2quuvD.net] いろいろ考えているうちに構文規則がおかしなことになってきました; とりあえず負の数やかっこを含む数式の構文木を一通り考えてみたつもりなんですけど、 以下のような感じであっているでしょうか? fast-uploader.com/file/6973521373227/ また、他に欠けているパターンはないでしょうか?
137 名前:デフォルトの名無しさん mailto:sage [2014/12/08(月) 18:02:04.16 ID:3czqE9B9.net] >>132 単項演算子はどこに行ったんだ
138 名前:117 mailto:sage [2014/12/08(月) 21:29:48.11 ID:yQ2quuvD.net] >>133 あれは構文木と言うより抽象構文木というか内部構造と言うかそんなかんじのものですね; 負の数をどう計算するか考えてたらその式や数字に-1をかければいいかなと思って作ってました。 今度はきちんと抽象じゃない構文木を考えます。 はい。
139 名前:117 mailto:sage [2014/12/08(月) 23:27:15.44 ID:yQ2quuvD.net] とりあえず自分がわかっている範囲で -(1+2)*4 の解析木を作ってみました。 fast-uploader.com/file/6973604307310/ enzan番号という名前はやめてみました。 空欄部分は下位置調節のためや何を入れたらいいかわからない部分です。
140 名前:117 mailto:sage [2014/12/09(火) 21:43:09.57 ID:KYZ3f1RL.net] 構文規則作ってみましたが、選択の衝突が消えません。 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.
141 名前:117 mailto:sage [2014/12/09(火) 21:44:56.07 ID:KYZ3f1RL.net] void tasuhiku(): {} { kakewaru() //608行目 ((<TASU>|<HIKU>)kakewaru2())* } void kakewaru(): {} { minus() ((<KAKERU>|<WARU>)sikikakko())* } void kakewaru2(): {} { sikikakko() ((<KAKERU>|<WARU>)sikikakko())* }
142 名前:117 mailto:sage [2014/12/09(火) 21:45:41.74 ID:KYZ3f1RL.net] void minus(): {} { [<HIKU>]sikikakko() } void sikikakko(): {} { ("(" tasuhiku() ")" |atai()) } void atai(): {} { <SUUZI> }
143 名前:デフォルトの名無しさん [2014/12/10(水) 06:22:59.98 ID:ICK0nNNi.net] 荒らされてるなぁ・・・
144 名前:デフォルトの名無しさん [2014/12/10(水) 14:14:42.32 ID:lFxVBhH5.net] >>136 文法作るのはものすごく難しいんだよ。 同じ文書を受理する複数の文法が存在し、複数の間で優劣がある。 しかも、優劣を機械的に評価することが難しい。 「こいつを使えば簡単にできる」というようなソフトウェア紹介を見かけると 思うけど、そんな魔法の杖みたいなソフトは無いから。 そういうこと言ってる人は、付属してきたサンプルを動かして簡単といってるだけ。 信じちゃだめだ。 構文解析器の生成系を自分で作れるようにならないと文法を作れないと思っていい。 少なくともその程度の理解は必要。 まずドラゴンブックを買ったらどうかと思うんだが。
145 名前:デフォルトの名無しさん [2014/12/10(水) 14:18:41.54 ID:lFxVBhH5.net] まずドラゴンブックを買う。 実際に作ってみる。 この作ったものは実用にはならないよ。 テーブルが大きすぎるからね。 それでも作ることが重要。 その後に、市中に出回る生成系を使ってみたらどうだろう。 俺はこの順番が良いと思うよ。 中身の動作を知らないと使えないって、ツールとしては下等だけど、 今はまだその程度の世界なんだよ。
146 名前:117 mailto:sage [2014/12/10(水) 16:50:00.17 ID:pQyEQrGQ.net] >>139 私のことだったら荒らそうと言うつもりは全くありません。 でも荒らしに見えてしまっていたならすいません。 >>140-141 ドラゴンブックってこれのことですかね? 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を使うようになりました。 なんにせよ周りに作ったことある人とかいないので、 www.sbcr.jp/products/4797337958.html とか item.rakuten.co.jp/books-sanseido/ebm-techno03/ とか片手に独学でやってます。
147 名前:デフォルトの名無しさん [2014/12/10(水) 17:17:43.47 ID:lFxVBhH5.net] >>142 そこが勘違いなんだよ。 JavaCCを使うにはJavaCCを作れる程度の知識が必要。 だからドラゴンブックが必須。 ドラゴンブックは決して読みやすい書籍ではないよ。 どうとでもとれる表現がいくつもある。 読み解きながら理解する必要があるので、結局生成系を自分で一つ書き上げる必要がある。 「JavaCCを使えば知識がなくてもこんなに簡単」的なことを書く人は 実はJavaCCを使っていないんだよ。 そこに騙されてはいけない。 文法を作るには深い理解が必要なんだよ。 簡単にできる方法はない。
148 名前:デフォルトの名無しさん mailto:sage [2014/12/10(水) 18:27:22.40 ID:eXNtCHKb.net] 誰か別の人にやってもらえばいいんだよ。クラウドソーシングとかあるじゃん。
149 名前:デフォルトの名無しさん mailto:sage [2014/12/10(水) 21:11:35.37 ID:Lctd7lUm.net] 荒らされてるんじゃなくて話題がなさすぎるから一人が専有してるように見えるだけだろ?
150 名前:117 mailto:sage [2014/12/10(水) 21:46:27.74 ID:pQyEQrGQ.net] ");
//]]>-->151 名前:3" target="_blank">>>143 >「JavaCCを使えば知識がなくてもこんなに簡単」的なことを書く人は そこまで言われたことはないです。 一番最初は文字列を自分で解析するところからやろうとしてましたけど、 パーサジェネレータを知ってからわたしにとってはそっちの方が楽だと感じています。 ここで質問したこと以外でも詰まったりもしましたけども、 もし構文解析ツールを1から作っていたらきっとここまでたどり着くまでにもっと詰まっていると思います。 >>144 すいません。 実はこれ卒業研究なので・・・。 自分で作ってみたい→卒研のテーマに悪くないよね? な感じで決めてしまったテーマです。 >>145 連投とかしすぎましたかね・・・; [] [ここ壊れてます]
152 名前:デフォルトの名無しさん [2014/12/10(水) 21:57:46.01 ID:dcz7kjCK.net] 指導教授に聞けば。