「コンパイラ・スクリプトエンジン」相談室16

2014/07/20(日) 11:16:19.37ID:p6eMVAxc
プログラミング言語処理系の開発に興味のある人達のスレッドです。
字句解析・構文解析から,データフロー解析,ループ並列化,データ分散,SSA変換,
CPS変換,レジスタ割付,命令スケジューリング,ソフトウェアパイプライン,
SIMD命令生成,VLIW向けクラスタリング,スクラッチメモリ向け最適化,リンク時最適化,
JIT,動的バイナリ変換等の各種最適化,それにVM,GC,低消費電力化などなど。
意味論に関する話題も歓迎です。

Wikiのまとめページ
http://www6.atwiki.jp/compilerandscriptengine/
2014/08/13(水) 00:29:26.50ID:IvuVUKO/
>>32
EdenだけCopy GC,OLDに行ったらMarkSweepとか色んな掛け合わせもあるみたいだね
2014/08/14(木) 01:15:17.94ID:nk1V5Hss
mostly-concurrentマーク&スイープGCは?
1. ミューテータを止めてルートセットをマーク
2. ミューテータと並行に別スレッドでマーク
3. ミューテータを止めて再度ルートセット+残り全部をマーク
4. ミューテータと並行に別スレッドでスイープ
ってやるやつ
ライトバリアがいるからGC以外のところでGCを考えずには済まないけど (そのへんは世代別も一緒だが)
最大停止時間は短いと思うよ
35デフォルトの名無しさん
垢版 |
2014/09/20(土) 16:42:37.06ID:Vt9JAeIo
caperが改善されて大規模なパーサーでも
早く生成できるようになったようです。
2014/09/20(土) 17:18:58.94ID:INF4B04G
あんまりでっかいの書かないんで今まで困った事ないのだが、吉報には違いなかったりするのでお礼を述べさせて貰います、ありがとう。
>>Thanks for ジョニガタさんとMZさん
2014/09/21(日) 00:08:58.31ID:+YftySIr
やること
★Ruby RaccとCaperの比較レビュー。
★CaperでCSVパーサーの作成。
★CaperでXMLパーサーの作成。
38sage
垢版 |
2014/09/26(金) 04:19:50.66ID:VUi+/UsP
winXP visual studio 2010 expressで
antlr4の導入できた方いらっしゃいませんでしょうか?
2014/09/26(金) 10:04:23.12ID:8tItaSRz
ANTLRWorks とか言うヤツはダメなん?
2014/09/27(土) 01:39:11.71ID:oNml76ai
バッチファイルみたいなのに定義ファイルかませば出せると思いきや、
JAVAしか出てこない。。。
英語よく読めない
2014/09/27(土) 01:53:39.94ID:PIGMRS01
akiramero
2014/10/12(日) 13:57:53.54ID:fouZ38nR
やっと簡単な電卓インタプリタができたー
43デフォルトの名無しさん
垢版 |
2014/10/12(日) 15:26:51.34ID:s0CJmRCd
おめおめ
四則演算と簡単な制御構造が実装できると
あとは応用だから
扱う型の種類が増えない限り楽に拡張できそうだね
2014/10/13(月) 01:35:36.78ID:UPM0IlOC
演算子って四則演算以上のことやらすと必ずそいつが決めた優先順位に縛られて破綻するし
電卓ならLISPの(+ 1 2 3 4 5)みたいに演算子相当が無くてオペランド側をいくらでも増やせる構文の方が楽
2014/10/19(日) 05:56:05.61ID:irMeVnbo
それもそいつが決めた優先順位なわけだが
2014/10/19(日) 07:29:43.65ID:Ww99Jszp
LISPはLISPで解析器に都合の良い構文だと思う
もちろんそういう意味で(作る側が)楽と言ってるんじゃないのは分かっているが
もう少し使う人間のことも考えてやれと
……で行き着くのも例えばpythonだったりするのでそれはそれでうーん
2014/10/19(日) 19:43:22.93ID:U9zncy/O
古代言語なんだから人間向きなわけがない
2014/10/19(日) 19:50:43.83ID:wwCHsqfk
慣れたら何とも無いけど
2014/10/19(日) 23:32:38.99ID:zZJPnNDh
>>46
FORTHが一番解析器に優しいと思う、Lispは少なくとも関数に渡す引数の数は解析で判断できるけど、FORTHはそれすら捨ててる
あとLispは支援するエディタがあれば書く事に戸惑いは殆どないよ。
読むのは適切なインデントがされていないと辛いのは本当だけどそれだってRubyやらCやらでインデント無しと変わらないと思う。

なお、Pythonはインデントが構文に含まれているのが嫌い(エディタで再フォーマットできない)
2014/10/20(月) 07:07:45.12ID:vNvY5rmm
ある海外のファンタジー小説で、異世界召喚されたプログラマが魔法でFORTHを実装して
最強魔導師になってた。
2014/10/20(月) 07:26:17.53ID:fcKonDPy
May the forth be with you.
2014/10/20(月) 11:16:47.94ID:6/LNQkyp
Lispは見た目的に「目にひっかからない」(関数もマクロもみんな同じようにしか見えない)のが問題なんだけど、
最近流行ってる(?)みたいに ( ) と [ ] を使い分けるとかすると、だいぶ感じが違うと思う。
2014/10/20(月) 16:23:26.53ID:s/tFnXbk
>>52
Clojureが凄い良くできてる
()でリスト,[]でベクタ,{}でマップ、#{}でセットとリテラルの扱いが凄い綺麗
2014/10/25(土) 10:10:07.27ID:9gGhLYaB
{} はすごくいいね。素の lisp だとほとんど使われない記号でもったいなかった。しかも数式とも合ってる。
ただ[] は好きになれないなぁ。個人的趣味だけど。
2014/10/25(土) 13:15:04.28ID:rVCkRMh+
変わった趣味だw
2014/11/01(土) 16:34:43.21ID:5yNYNAVX
エラーメッセージを楽して、素晴らしく表示したいんですけど
いい方法を教えてください。
2014/11/01(土) 18:28:37.68ID:yfMW+WpF
>>56
センスのいい奴に頼む
2014/11/01(土) 19:12:18.30ID:md1XyPQH
言うても行桁理由以外に何か必要かね
2014/11/01(土) 19:25:31.66ID:etXlBO/A
ファイル名…かな
2014/11/01(土) 20:57:55.11ID:68QCuiUg
エラー表示は?だけでいい
というネタがあったな
2014/11/02(日) 00:04:36.51ID:FPvqJpqA
人間が見てるのとコンパイラが解釈してるので大きくズレがある場合とか
エラーメッセージ見てわからんことが多々ある

xxの前にxxがあります/ありません系のエラーはウンザリ
2014/11/02(日) 00:22:55.85ID:E/aMB+tP
print " _人人 人人_ \n",
"> 突然の死 < ", col, ",", row, " in ",filename,":", reason, "\n",
"  ̄Y^Y^Y^Y ̄\n";
die;

楽して素晴らしい方向を考えた
2014/11/02(日) 04:19:14.28ID:l3Xq9EsR
$ nmlc -run examples/lablgl/triangle.nml
Fatal error: exception Failure("
_人人 人人_
> 突然の死 < parse error line 33
 ̄Y^Y^Y^Y^Y ̄
")
って出るようにしてみた。
2014/11/02(日) 07:10:13.81ID:Pf8ySLA3
何のエラーか
なぜ起こったか
どうすれば良いか

のうちどこまでエラー表示するか
表示しないものはマニュアルに書くか
統一しておくと良い
2014/11/02(日) 10:22:44.88ID:P2QTHoYV
何のエラーか数字で提示
あとはknowledge baseで
knowledge baseは迷宮
2014/11/02(日) 11:43:14.80ID:6U4Atlhd
基本的には書いた人の頭のエラーだからな。
コンパイラ的には「チェンジ!チェンジ!この子変えて!!!」
だけでいい。
67デフォルトの名無しさん
垢版 |
2014/11/02(日) 12:31:43.49ID:4dYx0WR7
> 関西型プログラミング言語のひとつ Kyoto のコンパイラは,文法ミスのあるコードを与えると「ふうがわりなコードどすなぁ」とだけ返すので,何が間違っているかはこちらで推測する必要がある.
2014/11/02(日) 12:39:13.58ID:FPvqJpqA
何回も間違ったらぶぶ漬けが出てきそうだな
2014/11/02(日) 12:58:18.94ID:i2BOrYsG
>>64
> どうすれば良いか

これは余計なお世話だわ
2014/11/02(日) 13:03:44.74ID:FPvqJpqA
この道路は工事中なので次の迂回路をご利用ください
2014/11/02(日) 16:35:04.02ID:l3Xq9EsR
コンパイル速ければ、エラーは1個で十分だったりするよなぁっとか。
大量に出すなら、一番先頭のエラーを一番下に出すと嬉しいとか。
2014/11/03(月) 12:49:03.39ID:ljM6XCm0
>> 70

迂回は出来ないんだなぁ
2014/11/03(月) 18:22:08.25ID:6fFurIEN
最近のghcとかだと、関数名をタイポすると似た存在する関数名を示してくれる。外してる時もあるけど。
ああいう親切さをもっと充実させるのも方向性としてはありだと思う。
あらゆるコンパイルエラーがクラウドサーバに送られ続けて典型的なミスを蓄積し続ける、とかね。
2014/11/04(火) 11:17:19.99ID:bZGUB4M2
大量のデータをまとめて整理した結果をどこかで見たけど
よくあるスペルミス・インポート忘れ・宣言忘れが飛び抜けていて
それ以外はごくわずかでどうでもいいという印象だった
2014/11/04(火) 11:19:32.39ID:bZGUB4M2
中級者以上と入門者はつまずく所が全く違うから
後者のデータだけを集めれば「入門者に最適」な言語やツールが作れるかもしれない
2014/11/04(火) 13:56:57.87ID:OXvDS9Yh
C言語は、研究結果;はあった方が良いみたいな話を聞いた事があるような気がする。
けど、最後だけ無しとかだったのかもしれないし、良く覚えてないなぁ。
今作ってる言語は必要な所だけ;を書くって作ってるのだけど。
初心者には難しいのかもしれないです。
2014/11/04(火) 15:36:24.07ID:bZGUB4M2
気の利いたエディタサポートまで考えるなら改行をまたぐ構文を禁止すべき
VBはそうなってる
2014/11/04(火) 15:58:19.03ID:vqrMdBMn
lispとかでマクロ展開したときに中でエラーが起こったら行と桁の表示は諦めるしかないのかな
前に作ったとき展開後も展開前の行を引き継ぐやり方をしてたけど
2014/11/04(火) 17:04:17.39ID:99dxtSJ/
>>78
トークンに文字列だけじゃなく、もとあった位置の情報も付けたら?

>>76
どんな言語でも、ある程度本格的なプロダクトなら、たいてい、「やたら長くなるから改行を挟みたい式」と
「やたら短くて似たようなのが連続するから1行にまとめたい文」の両方が出てくるので、
どちらを強制するのも一長一短。

構文的には (a, b, c, d) と {a; b; c; d;} の、どちらも似たようなものだけど、機械的なコード生成では
後者のほうが以前は楽だった(最近は可変長配列みたいなオブジェクトに入れて、最後に
joinとか、ライブラリが充実してる言語を使うのが普通なので、あまり差は無い)。

人間の作業としては、複数行にまたがるものでは前者のほうはちょっとめんどい。
(最後の行を削ったあとで、前の行の最後も削る必要があるので)
{a,
b,
c}
みたいに閉じカッコを行末に付けてしまえばそうでもないかもだが。

あとそもそもC言語の構文では ; の規則がちょっと変則的。
2014/11/04(火) 23:11:55.77ID:DC7Ttoit
Lispマクロのデバッグはちょっと難しいよな。
backquoteのように構文上の構造を引き継ぐような奴ばかりならいいんだけど。
2014/11/04(火) 23:12:32.22ID:DC7Ttoit
デバッグ→デバッグ情報
2014/11/04(火) 23:31:17.91ID:6PskSs9/
複雑なマクロでもたいていは展開系見れば何とかなるね。それでも動かないマクロがたまーにあって辛いけど。
83デフォルトの名無しさん
垢版 |
2014/11/04(火) 23:40:21.11ID:cufVHbaO
自作のコンパイラなりなんなりはデバッグと最適化を考えたらなにも出来ない
むしろ潔く投げ捨てる勢いと割り切りで走らないとダメっしょ
俺様考えたルールで動いた万歳終わりな感じ
四則演算と条件文、あとGOTOなりCALLなりがあれば立派
それ以上の高度化は努力しだいってことで
それとも大人しくCommon Lispあたりを使って妥協するとか
Lispだと関数を生成して実行できるんだよね
例えば入力画面の項目数とか要件とかを与えて関数の形で生成して実行な感じの

俺様コンパイラ、Lispコード生成するからコンパイルや実行デバッグはそちらでオネガイみたくw
2014/11/05(水) 01:50:49.88ID:j8mQRcC4
そこまで楽するなら構文をリードマクロで定義したほうが早そう
2014/11/05(水) 07:49:49.12ID:xr1YCX3/
xmlってスクリプト言語なの?データ構造なの?
xmlを使ったスクリプト言語らしきモノもあるみたいだし、よーわからん
2014/11/05(水) 08:22:34.79ID:Fpn6fvq+
>>83
C とかのソース吐いて、最適化よろしくね(はーと)でいいだろ
2014/11/05(水) 09:54:15.68ID:gfolKTI3
>>85
データ構造だろ
パーサ作るのが楽というか有りものが使えるからxxxxMLみたいに拡張して使われるんだろう
2014/11/05(水) 11:54:58.98ID:bBYPRYMe
>>85
プレーンテキストってスクリプト言語なの?データ構造なの?
2014/11/05(水) 17:03:13.23ID:I87EWij/
>>88
只の文字列だよ
そこに意味を付けるのはまた別の事
2014/11/05(水) 17:58:10.42ID:uuXXn0N9
シェルスクリプトとかみたいな意味でスクリプトではない。
XSLTとか、あとワドラー氏が冗談で提案していたと思うがXMLで表現するプログラミング言語と
いうものもありうるけど、XML自体は単なるデータ構造でしかない。
2014/11/05(水) 21:09:37.17ID:WN8UKbpt
XMLにロジックを書く者は呪われる。やめておいた方がいい。あれはデータ形式としても冗長すぎるし、良いところはない。
S式を使うといい。
2014/11/05(水) 21:32:19.82ID:uuXXn0N9
XSLTは割とよくできてるよw
2014/11/06(木) 01:58:37.08ID:Rw7wEfhr
閉じ括弧重ね書き文化は誰も止めなかったのかねえ))))))))))))))))))))
2014/11/06(木) 02:08:22.53ID:rrEEAzVB
Cみたいな中括弧、改行、インデントを繰り返すのもイマイチ
2014/11/07(金) 19:44:15.64ID:XxPyN8W7
整ってると思うがなあ
switch, caseだけはアレだが
2014/11/07(金) 20:31:09.14ID:sXupdHKX
switchとcaseは同じインデントにしてbreakだけ字下げだよね?ね?
2014/11/07(金) 20:52:59.78ID:4yd7iQ66
>>96 に一票
2014/11/07(金) 22:25:11.01ID:fMVGCDH+
(,)は特別な意味持たせたいとかあるので難しいですね。
(a,)はタプルにしようか、タプルじゃないのかとか。(,a)はタプルとか。
2014/11/09(日) 11:22:54.52ID:/PoG0aeo
Pythonの「1要素のタプル」はトリッキーだが面白いとは思った。
kなんとかの人が言ってるように、カッコなしでもそうなるのは罠だがw
100デフォルトの名無しさん
垢版 |
2014/11/09(日) 12:10:23.68ID:6nixZySy
lispだと(a)とaの違いかな
2014/11/09(日) 16:44:48.42ID:7O7eobU9
>> 100

そんな感じ。名前のない構造体
2014/11/09(日) 20:23:26.03ID:15ZMIIuR
いや名前ある、タプル
2014/11/10(月) 01:34:25.20ID:zIX5GD/A
ここって正規表現エンジンの話もいいのかな
nfaとdfaのハイブリッドエンジンを実装したいんだけど
dfaの中にnfaがあったらどう処理するかとかどこまでdfaにしていいかとかさっぱり分からない
調べてもon-the-flyという単語ぐらいしか出てこなくて実装方法とかは見つからない
知ってる人いたら教えてほしい
2014/11/10(月) 07:33:01.86ID:XDoaKxdi
schemeの自作コンパイラ作成の過程で、cps変換につまづいています。
よくネット上で「簡単な処理で実現できる」という感じで書いてあるのを良く見るのですが、
実際にやろうとするとなかなかできません。
具体的に何をやったらいいのでしょうか?

ちなみにlambdaでのcps変換はぎりぎり理解できてると思います。
105デフォルトの名無しさん
垢版 |
2014/11/10(月) 09:06:04.50ID:hP+YfTbo
Scheme使ってるならEoPLの最後のほうの章読んだらええで。
2014/11/10(月) 12:08:25.51ID:s3EMdqhf
>>103
つ ドラゴンブック, lazy transiyiOn evaluation

古典実装だとoriginal egrep
2014/11/10(月) 17:06:44.93ID:G4zfChd8
>>100
Lisp の (a) は (a . nil) だからちょっと違う。

>>101
構造体とかそういう別の名前を持ち出したりするとややこしくなるだけ。
2014/11/11(火) 02:10:53.26ID:85SNGvMw
>>106
ありがとう
でも自分の望んでるのとは違うみたい
2014/11/12(水) 01:44:27.15ID:DTrQhtqP
>>108
この延長線上にある話だと理解できてないか、
SFA(semi-deterministic finite automata)を勘違いしてon-the-flyだと思っている。
前者ならGNU Rxを読めばいい。
2014/11/12(水) 01:57:21.21ID:/4vNcbkH
>>109
多分後者かもしれない
自分の考えてるのは(X)*aときたら
1 ==(X)==> 1
1 ==a==> 2
というdfaを作って次のノードへの遷移条件が文字じゃなくてnfaなら
それを優先して見てマッチしたらその先に行く方法を考えてた
それならnfaとdfaをうまく組みあわせられると思って

あとsfaは今初めて知った
sfaとかon-the-flyは調べてもちゃんとした説明が出てこなくて困る
2014/11/12(水) 01:59:11.10ID:/4vNcbkH
あとnfaだけかdfaだけなら偶然持ってたドラゴンブックやネットの情報が十分にあって実装出来た
ハイブリッドにする方法が分からなくて途方に暮れてる
2014/11/12(水) 11:39:32.29ID:b8dDlQST
SFAでググったらランク上位の日本語の記述がこれだった
http://www.slideshare.net/mobile/sinya8282/ss-12170832

役に立つかは知らないけどマッチングの並列実行だってさ
2014/11/15(土) 04:11:51.30ID:2wuAQ8Y6
DFAで出来ないこと、やると遅いことをNFAでやる。
DFAにならない正規表現の拡張や状態が爆発するn回繰り返しなど。
114片山博文MZ次期CEO ◆T6xkBnTXz7B0
垢版 |
2014/11/29(土) 15:46:21.26ID:AWiICJMh
Caperで、Haxe用のパーサーが作れるようになったらしいぞ!!!

http://jonigata.github.io/caper/caper.html
2014/11/29(土) 19:24:39.29ID:bjHueY84
ということはjavaとphpとC#に対応したということか
2014/11/29(土) 19:25:23.30ID:bjHueY84
って元からしてんじゃん…
2014/12/04(木) 17:14:51.41ID:hjxCxC4V
スレ立てるまでもない質問はここで 139匹目から来ました。

JavaCCで負の数と引き算を識別したいんですけど、どう定義したらいいでしょうか?

以下現状の一部抜粋(メソッド名についてはスルーしてください)
void enzan3() :
{}
{
enzan4()((<TASU>|<HIKU>)right=enzan4())*
}

void enzan4() :
{}
{
enzan5()((<KAKERU>|<WARU>)enzan5())*
}

void enzan5() :
{}
{
<MOZI>|[<HIKU>]<SUUZI>|"(" e=enzan3() ")"
}
2014/12/04(木) 18:52:41.09ID:jHjIGczB
>>117
そのスレの997以降のはやってないの?

number=0..9
plus::=<expr> + <expr>
minus::=<expr> - <expr>
expr::=<number>|<plus>|<minus>
な感じになるだろうし

単項のマイナスはexprにかからない形式で-が出てきた時だし間違いようがなさそうに思うんだけど
2014/12/04(木) 20:49:24.04ID:hjxCxC4V
あ。
そこの
>単項演算子と二項演算子の区別
についてはまだ調べてないです。
調べてみます。

二項演算子+,-の間に二項演算子*,/を含む式があって、
その中にカッコか数字か変数呼び出しなどがあるように定義するのではないのですか?
例えば
-1
1-2
-2*4
2/(-2+5)
などの書き方が使えるようになるといいなとか考えています。

>>118
::=って書き方は確かBNF記法でしたっけ?
その書き方についてぜんぜん知らないのでそれも調べてみます。
2014/12/06(土) 17:09:31.69ID:evyQIgPT
みんなBNFとかやってるのか
char配列にして解析してるから常に最後が';'だと楽なんだよね
'{'で+1、'}'で-1、+-0の状態で';'がきたらその構文が完結する
int a;, class {}; switch{}; void hey(){}; if(true){}; for(){};
2014/12/06(土) 17:17:29.59ID:djm9MkQZ
演算子の優先順位はどうしてんの?
2014/12/06(土) 17:30:21.62ID:5oGFUyw+
べつに区切り文字が = だろうが : だろうが ::= だろうが BNF は BNF だ
123117
垢版 |
2014/12/06(土) 23:05:55.88ID: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) → A(enzan4)
演算子:- 左辺:A(enzan4) 右辺:5(enzan5) → B(enzan4)
演算子:+ 左辺:1(enzan5) 右辺:B(enzan4) →C(enzan3)
124117
垢版 |
2014/12/06(土) 23:06:51.00ID:BPhK2Nlg
とりあえずenzan3の定義の先頭にマイナスの記号があるかもしれないという意味合いで
以下のようなコードに変えてみました。

void enzan3() :
{}
{
[<HIKU>]enzan4() //★
((<TASU>|<HIKU>)enzan4())*
}

void enzan4() :
{}
{
enzan5()
((<KAKERU>|<WARU>)enzan5()
}

void enzan5() :
{}
{
<MOZI>|<SUUZI>|"(" enzan3() ")"
}

<>:トークン |:左右のどちらかの構文(||やOr演算子のようなもの) []:省略可能構文
125117
垢版 |
2014/12/06(土) 23:07:27.16ID: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>トークンが共通点らしいです。
そもそもの考え方が間違っているかもしれませんが、
それを抜きにしてもまずなぜこのような警告が出ているかわかりません。
一体なぜ出ているかわかる人いれば教えてださい。
2014/12/06(土) 23:08:41.58ID:q7blqefO
>>120
java(というよりC)のforは()の内部に;が出てくるのが
>>119
javaccの書き方と大差ないみたいよ
2014/12/06(土) 23:27:12.88ID:5oGFUyw+
この文脈でconflictは「衝突」と言う。
そのメッセージの通り、複数の定義で共通してるトークンがあるから、どっちの定義のほうだとして
解釈していいかわからないからエラーになる。
そのメッセージでは「Consider using a lookahead of 2 or more for nested expansion.」2個あるいはそれ以上の
先読みを使うことを検討してみろ、と言っているが、それに従ったところでうまくいくかどうかは
わからんけどね。
2014/12/07(日) 01:31:54.20ID:bfkTF4nN
>>123
>>121は重要なヒント
-(1+2)とか、1+(-2)とかにその定義で対応できる?

たとえば★の行をenzan5に移してみるなり、演算子の優先順位を変えてやりなおすとか
それとは関係ないけど、3*2/4って直感的には( (3 * 2) / 4 )になりそうだけどその構文木だと右から左なのね
2014/12/07(日) 01:36:47.04ID:bfkTF4nN
>>128
勘違いしたわすれて
130117
垢版 |
2014/12/07(日) 21:58:06.68ID:OacxF8nB
>>127
選択の衝突でしたね。
間違えて覚えました;
かぶってるらしいからLOOKAHEADで先読みをしなくてはならないのはわかるのですが、
そのコードでどのパターンとどのパターンでかぶってるのかがわからなくて。

>>128
>-(1+2)とか、1+(-2)とかにその定義で対応できる?
1+(-2)のパターンは意識していましたが、-(1+2)のパターンは忘れてました。
きちんと考えなおしてきます。
2014/12/07(日) 22:37:16.24ID:bfkTF4nN
>>130
試しに四則演算のみ行う言語をjavaccで作ってみたけど単行演算子程度ならLookAheadいらないよ
132117
垢版 |
2014/12/08(月) 00:25:52.66ID:yQ2quuvD
いろいろ考えているうちに構文規則がおかしなことになってきました;
とりあえず負の数やかっこを含む数式の構文木を一通り考えてみたつもりなんですけど、
以下のような感じであっているでしょうか?
http://fast-uploader.com/file/6973521373227/
また、他に欠けているパターンはないでしょうか?
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況