「コンパイラ・スクリプトエンジン」相談室16 (648レス)
前次1-
抽出解除 レス栞

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
117
(18): 2014/12/04(木)17:14 ID:hjxCxC4V(1/2) AAS
スレ立てるまでもない質問はここで 139匹目から来ました。

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

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

void enzan4() :
{}
省8
118
(1): 2014/12/04(木)18:52 ID:jHjIGczB(1) AAS
>>117
そのスレの997以降のはやってないの?

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

単項のマイナスはexprにかからない形式で-が出てきた時だし間違いようがなさそうに思うんだけど
123
(1): 117 2014/12/06(土)23:05 ID:BPhK2Nlg(1/3) AAS
>>120
>みんなBNFとかやってるのか
JavaCCの場合字句解析でトークン列に分解してくれて、
>>117にあるようにそのトークンの並びを書いて構文解析の定義をします。
なのでBNF記法とは違った書き方になります。

>>121
>演算子の優先順位はどうしてんの?

いい説明文が思い浮かばないので、
まずは例として1+2*3/4-5という式を構文木にしたものを以下にアップします。
外部リンク:fast-uploader.com
省5
124: 117 2014/12/06(土)23:06 ID:BPhK2Nlg(2/3) AAS
とりあえずenzan3の定義の先頭にマイナスの記号があるかもしれないという意味合いで
以下のようなコードに変えてみました。

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

void enzan4() :
{}
省10
125: 117 2014/12/06(土)23:07 ID:BPhK2Nlg(3/3) AAS
すると、以下のような警告が出ました。

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>トークンが共通点らしいです。
そもそもの考え方が間違っているかもしれませんが、
省2
130
(1): 117 2014/12/07(日)21:58 ID:OacxF8nB(1) AAS
>>127
選択の衝突でしたね。
間違えて覚えました;
かぶってるらしいからLOOKAHEADで先読みをしなくてはならないのはわかるのですが、
そのコードでどのパターンとどのパターンでかぶってるのかがわからなくて。

>>128
>-(1+2)とか、1+(-2)とかにその定義で対応できる?
1+(-2)のパターンは意識していましたが、-(1+2)のパターンは忘れてました。
きちんと考えなおしてきます。
132
(1): 117 2014/12/08(月)00:25 ID:yQ2quuvD(1/3) AAS
いろいろ考えているうちに構文規則がおかしなことになってきました;
とりあえず負の数やかっこを含む数式の構文木を一通り考えてみたつもりなんですけど、
以下のような感じであっているでしょうか?
外部リンク:fast-uploader.com
また、他に欠けているパターンはないでしょうか?
134: 117 2014/12/08(月)21:29 ID:yQ2quuvD(2/3) AAS
>>133
あれは構文木と言うより抽象構文木というか内部構造と言うかそんなかんじのものですね;
負の数をどう計算するか考えてたらその式や数字に-1をかければいいかなと思って作ってました。
今度はきちんと抽象じゃない構文木を考えます。 はい。
135: 117 2014/12/08(月)23:27 ID:yQ2quuvD(3/3) AAS
とりあえず自分がわかっている範囲で -(1+2)*4 の解析木を作ってみました。
外部リンク:fast-uploader.com
enzan番号という名前はやめてみました。
空欄部分は下位置調節のためや何を入れたらいいかわからない部分です。
136
(1): 117 2014/12/09(火)21:43 ID:KYZ3f1RL(1/3) AAS
構文規則作ってみましたが、選択の衝突が消えません。
tasuhikuのkakewaruをkakewaru2に変えると消えます。
kakewaruで呼んでるminusの[<HIKU>]がtasuhikuの<HIKU>と競合しているのかと思いましたが、
なぜなのかわかりません。
どこが間違っているでしょうか?

警告なのでとりあえず無視してjavacコンパイルして解析&実行させてみると、以下の式はきちんと実行できました。
1+2+3
-9-3
1+2*3/4-5
7+(-2)
省11
137: 117 2014/12/09(火)21:44 ID:KYZ3f1RL(2/3) AAS
void tasuhiku():
{}
{
kakewaru() //608行目
((<TASU>|<HIKU>)kakewaru2())*
}

void kakewaru():
{}
{
minus()
省8
138: 117 2014/12/09(火)21:45 ID:KYZ3f1RL(3/3) AAS
void minus():
{}
{
[<HIKU>]sikikakko()
}

void sikikakko():
{}
{
("(" tasuhiku() ")"
|atai())
省6
142
(1): 117 2014/12/10(水)16:50 ID:pQyEQrGQ(1/3) AAS
>>139
私のことだったら荒らそうと言うつもりは全くありません。
でも荒らしに見えてしまっていたならすいません。

>>140-141
ドラゴンブックってこれのことですかね?
外部リンク:www.amazon.co.jp
(私にとって)安くないですし今そこから勉強している余裕はないので・・・。
すいません。

よそでパーサジェネレータ使った方がいいとか言われて、
Javaが好きなどの理由でJavaCCを使うようになりました。
省5
146
(1): 117 2014/12/10(水)21:46 ID:pQyEQrGQ(2/3) AAS
>>143
>「JavaCCを使えば知識がなくてもこんなに簡単」的なことを書く人は

そこまで言われたことはないです。
一番最初は文字列を自分で解析するところからやろうとしてましたけど、
パーサジェネレータを知ってからわたしにとってはそっちの方が楽だと感じています。
ここで質問したこと以外でも詰まったりもしましたけども、
もし構文解析ツールを1から作っていたらきっとここまでたどり着くまでにもっと詰まっていると思います。

>>144
すいません。
実はこれ卒業研究なので・・・。
省4
151: 117 2014/12/10(水)23:23 ID:pQyEQrGQ(3/3) AAS
>>147
Javaの研究室ではありますけど、先生は構文解析などの経験はないそうなので・・・。
ゼミのときに負の数と引き算の問題も一応聞いてみたんですけど、
残念ながら大したアドバイスをもらえませんでした。

ちなみに、研究室ではネットワーク関連のことやってる人が多いです。
155: 117 2014/12/11(木)00:04 ID:TxaNdaYp(1/4) AAS
>>148 >>150
すいません・・・。

>>149 >>152
"こういうところが新しいです"
と言える自信はありません・・・。 すいません。
一番の理由は"自分で作ってみたい"と思ったからです。
あと、先生に止められることもなかったですし。
構文解析が目的と言うよりは、半分ノリで付けてしまったテーマが
「初めでも使いやすい日本語で書けるプログラミング言語を作る」
なんてテーマです。
省6
158: 117 2014/12/11(木)07:22 ID:TxaNdaYp(2/4) AAS
>>156
プログラミングの棚にはなかったと思うんですけど、
とりあえず今日大学の図書館探してみます。
「ふつうのコンパイラをつくろう」の方は図書館にも置いてあったので。
160
(2): 117 2014/12/11(木)17:45 ID:TxaNdaYp(3/4) AAS
ドラゴンブックは残念ながら大学の図書館にはありませんでしたが、
市内(他区)の図書館にはあるとのことなので取り寄せて読みます。
1万円ほどの本を買うには残念ながらお金がないもので・・・;

他に大学にあった以下のコンパイルの本び中でおすすめってありますか?
コンパイラの基礎 / 徳田雄洋著
命令レベル並列処理 : プロセッサアーキテクチャとコンパイラ / 安藤秀樹著
コンパイラ入門 : 文法から設計・製作まで / 小田一博著
Cコンパイラ設計 : yacc/lexの応用 / A.T.シュライナー,H.G.フリードマン 著 ; 矢吹道郎 〔ほか〕訳
超並列処理コンパイラ / 村岡洋一著
コンパイラ / 疋田輝雄 著
省18
169: 117 2014/12/11(木)21:35 ID:TxaNdaYp(4/4) AAS
>>161
>文芸的なcobol+日本語ななでしこ?

cobolやなでしこは使ったことないのでわかりませんが、
私は英語を用いた言語よりはわかりやすいと思います。
コメント文での説明が要らないかどうかは作るものによりますけど。

>あるなら手にとって読んでみればいいのに

いろんな図書館に点々としてるそうで、
中にはどこにあるのかわからない図書館にある本だったりも・・・;
ちなみに、上げた24冊のうち私の工学部の校舎にある図書館に絞ると3冊しかないそうです。

>>162 >>164
省4
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.038s