「コンパイラ・スクリプトエンジン」相談室16 (648レス)
上下前次1-新
抽出解除 レス栞
117(18): デフォルトの名無しさん [sage] 2014/12/04(木) 17:14:51.41 ID:hjxCxC4V(1/2) AAS
スレ立てるまでもない質問はここで 139匹目から来ました。
JavaCCで負の数と引き算を識別したいんですけど、どう定義したらいいでしょうか?
以下現状の一部抜粋(メソッド名についてはスルーしてください)
void enzan3() :
{}
{
enzan4()((<TASU>|<HIKU>)right=enzan4())*
}
void enzan4() :
{}
{
enzan5()((<KAKERU>|<WARU>)enzan5())*
}
void enzan5() :
{}
{
<MOZI>|[<HIKU>]<SUUZI>|"(" e=enzan3() ")"
}
118(1): デフォルトの名無しさん [sage] 2014/12/04(木) 18:52:41.09 ID:jHjIGczB(1) AAS
>>117
そのスレの997以降のはやってないの?
number=0..9
plus::=<expr> + <expr>
minus::=<expr> - <expr>
expr::=<number>|<plus>|<minus>
な感じになるだろうし
単項のマイナスはexprにかからない形式で-が出てきた時だし間違いようがなさそうに思うんだけど
123(1): 117 [sage] 2014/12/06(土) 23:05:55.88 ID:BPhK2Nlg(1/3) AAS
>>120120(2): デフォルトの名無しさん [sage] 2014/12/06(土) 17:09:31.69 ID:evyQIgPT(1) AAS
みんなBNFとかやってるのか
char配列にして解析してるから常に最後が';'だと楽なんだよね
'{'で+1、'}'で-1、+-0の状態で';'がきたらその構文が完結する
int a;, class {}; switch{}; void hey(){}; if(true){}; for(){};
>みんなBNFとかやってるのか
JavaCCの場合字句解析でトークン列に分解してくれて、
>>117にあるようにそのトークンの並びを書いて構文解析の定義をします。
なのでBNF記法とは違った書き方になります。
>>121>演算子の優先順位はどうしてんの?
いい説明文が思い浮かばないので、
まずは例として1+2*3/4-5という式を構文木にしたものを以下にアップします。
外部リンク:fast-uploader.com
こんなかんじのまとまりです。
演算子:/ 左辺:3(enzan5) 右辺:4(enzan5) → ?(enzan4)
演算子:* 左辺:2(enzan5) 右辺:?(enzan4) → ?(enzan4)
演算子:- 左辺:?(enzan4) 右辺:5(enzan5) → ?(enzan4)
演算子:+ 左辺:1(enzan5) 右辺:?(enzan4) →?(enzan3)
124: 117 [sage] 2014/12/06(土) 23:06:51.00 ID:BPhK2Nlg(2/3) AAS
とりあえずenzan3の定義の先頭にマイナスの記号があるかもしれないという意味合いで
以下のようなコードに変えてみました。
void enzan3() :
{}
{
[<HIKU>]enzan4() //★
((<TASU>|<HIKU>)enzan4())*
}
void enzan4() :
{}
{
enzan5()
((<KAKERU>|<WARU>)enzan5()
}
void enzan5() :
{}
{
<MOZI>|<SUUZI>|"(" enzan3() ")"
}
<>:トークン |:左右のどちらかの構文(||やOr演算子のようなもの) []:省略可能構文
125: 117 [sage] 2014/12/06(土) 23:07:27.16 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>トークンが共通点らしいです。
そもそもの考え方が間違っているかもしれませんが、
それを抜きにしてもまずなぜこのような警告が出ているかわかりません。
一体なぜ出ているかわかる人いれば教えてださい。
130(1): 117 [sage] 2014/12/07(日) 21:58:06.68 ID:OacxF8nB(1) AAS
>>127127(1): デフォルトの名無しさん [sage] 2014/12/06(土) 23:27:12.88 ID:5oGFUyw+(2/2) AAS
この文脈でconflictは「衝突」と言う。
そのメッセージの通り、複数の定義で共通してるトークンがあるから、どっちの定義のほうだとして
解釈していいかわからないからエラーになる。
そのメッセージでは「Consider using a lookahead of 2 or more for nested expansion.」2個あるいはそれ以上の
先読みを使うことを検討してみろ、と言っているが、それに従ったところでうまくいくかどうかは
わからんけどね。
選択の衝突でしたね。
間違えて覚えました;
かぶってるらしいからLOOKAHEADで先読みをしなくてはならないのはわかるのですが、
そのコードでどのパターンとどのパターンでかぶってるのかがわからなくて。
>>128128(2): デフォルトの名無しさん [sage] 2014/12/07(日) 01:31:54.20 ID:bfkTF4nN(1/3) AAS
>>123
>>121は重要なヒント
-(1+2)とか、1+(-2)とかにその定義で対応できる?
たとえば★の行をenzan5に移してみるなり、演算子の優先順位を変えてやりなおすとか
それとは関係ないけど、3*2/4って直感的には( (3 * 2) / 4 )になりそうだけどその構文木だと右から左なのね
>-(1+2)とか、1+(-2)とかにその定義で対応できる?
1+(-2)のパターンは意識していましたが、-(1+2)のパターンは忘れてました。
きちんと考えなおしてきます。
132(1): 117 [sage] 2014/12/08(月) 00:25:52.66 ID:yQ2quuvD(1/3) AAS
いろいろ考えているうちに構文規則がおかしなことになってきました;
とりあえず負の数やかっこを含む数式の構文木を一通り考えてみたつもりなんですけど、
以下のような感じであっているでしょうか?
外部リンク:fast-uploader.com
また、他に欠けているパターンはないでしょうか?
134: 117 [sage] 2014/12/08(月) 21:29:48.11 ID:yQ2quuvD(2/3) AAS
>>133あれは構文木と言うより抽象構文木というか内部構造と言うかそんなかんじのものですね;
負の数をどう計算するか考えてたらその式や数字に-1をかければいいかなと思って作ってました。
今度はきちんと抽象じゃない構文木を考えます。 はい。
135: 117 [sage] 2014/12/08(月) 23:27:15.44 ID:yQ2quuvD(3/3) AAS
とりあえず自分がわかっている範囲で -(1+2)*4 の解析木を作ってみました。
外部リンク:fast-uploader.com
enzan番号という名前はやめてみました。
空欄部分は下位置調節のためや何を入れたらいいかわからない部分です。
136(1): 117 [sage] 2014/12/09(火) 21:43:09.57 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)
-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.
137: 117 [sage] 2014/12/09(火) 21:44:56.07 ID:KYZ3f1RL(2/3) AAS
void tasuhiku():
{}
{
kakewaru() //608行目
((<TASU>|<HIKU>)kakewaru2())*
}
void kakewaru():
{}
{
minus()
((<KAKERU>|<WARU>)sikikakko())*
}
void kakewaru2():
{}
{
sikikakko()
((<KAKERU>|<WARU>)sikikakko())*
}
138: 117 [sage] 2014/12/09(火) 21:45:41.74 ID:KYZ3f1RL(3/3) AAS
void minus():
{}
{
[<HIKU>]sikikakko()
}
void sikikakko():
{}
{
("(" tasuhiku() ")"
|atai())
}
void atai():
{}
{
<SUUZI>
}
142(1): 117 [sage] 2014/12/10(水) 16:50:00.17 ID:pQyEQrGQ(1/3) AAS
>>139私のことだったら荒らそうと言うつもりは全くありません。
でも荒らしに見えてしまっていたならすいません。
>>140-141
ドラゴンブックってこれのことですかね?
外部リンク:www.amazon.co.jp
(私にとって)安くないですし今そこから勉強している余裕はないので・・・。
すいません。
よそでパーサジェネレータ使った方がいいとか言われて、
Javaが好きなどの理由でJavaCCを使うようになりました。
なんにせよ周りに作ったことある人とかいないので、
外部リンク[html]:www.sbcr.jp
とか
外部リンク:item.rakuten.co.jp
とか片手に独学でやってます。
146(1): 117 [sage] 2014/12/10(水) 21:46:27.74 ID:pQyEQrGQ(2/3) AAS
>>143143(2): デフォルトの名無しさん [] 2014/12/10(水) 17:17:43.47 ID:lFxVBhH5(3/5) AAS
>>142
そこが勘違いなんだよ。
JavaCCを使うにはJavaCCを作れる程度の知識が必要。
だからドラゴンブックが必須。
ドラゴンブックは決して読みやすい書籍ではないよ。
どうとでもとれる表現がいくつもある。
読み解きながら理解する必要があるので、結局生成系を自分で一つ書き上げる必要がある。
「JavaCCを使えば知識がなくてもこんなに簡単」的なことを書く人は
実はJavaCCを使っていないんだよ。
そこに騙されてはいけない。
文法を作るには深い理解が必要なんだよ。
簡単にできる方法はない。
>「JavaCCを使えば知識がなくてもこんなに簡単」的なことを書く人は
そこまで言われたことはないです。
一番最初は文字列を自分で解析するところからやろうとしてましたけど、
パーサジェネレータを知ってからわたしにとってはそっちの方が楽だと感じています。
ここで質問したこと以外でも詰まったりもしましたけども、
もし構文解析ツールを1から作っていたらきっとここまでたどり着くまでにもっと詰まっていると思います。
>>144すいません。
実はこれ卒業研究なので・・・。
自分で作ってみたい→卒研のテーマに悪くないよね?
な感じで決めてしまったテーマです。
>>145連投とかしすぎましたかね・・・;
151: 117 [sage] 2014/12/10(水) 23:23:29.27 ID:pQyEQrGQ(3/3) AAS
>>147Javaの研究室ではありますけど、先生は構文解析などの経験はないそうなので・・・。
ゼミのときに負の数と引き算の問題も一応聞いてみたんですけど、
残念ながら大したアドバイスをもらえませんでした。
ちなみに、研究室ではネットワーク関連のことやってる人が多いです。
155: 117 [sage] 2014/12/11(木) 00:04:58.83 ID:TxaNdaYp(1/4) AAS
>>148 >>150すいません・・・。
>>149149(1): デフォルトの名無しさん [sage] 2014/12/10(水) 22:32:59.96 ID:eXNtCHKb(2/2) AAS
>>146
まさか卒業研究の本体がなんの新規性もない構文解析なわけじゃないだろう。
それが本質的な部分じゃなければ人に手伝ってもらうのもありだよ。
もし、構文解析そのものが君の卒業研究なら……
楽してでっち上げるという考えは即座に捨てて、143のいうようにちゃんと勉強して理解しな。
>>152
"こういうところが新しいです"
と言える自信はありません・・・。 すいません。
一番の理由は"自分で作ってみたい"と思ったからです。
あと、先生に止められることもなかったですし。
構文解析が目的と言うよりは、半分ノリで付けてしまったテーマが
「初めでも使いやすい日本語で書けるプログラミング言語を作る」
なんてテーマです。
"日本語なら初めてでもとっつきやすいかな?"なんて安易な考えで
「初めてでも」なんてつけて付けてしまいました。
構文を考える上で自分で後悔してたりします;
>>153
文法を考えるのも構文規則を作るのも楽なものではないと思ってます。
それよりも構文解析器を作るほうが難しそうと感じてしまっているのは事実です。
158: 117 [sage] 2014/12/11(木) 07:22:36.95 ID:TxaNdaYp(2/4) AAS
>>156156(1): デフォルトの名無しさん [sage] 2014/12/11(木) 01:55:24.44 ID:pP5Pqqse(1) AAS
>>153=154が優しく言ってくれてる
あなたが本当に本気なら明日にでも図書館行って、ドラゴンブック借りるといいよ
難しいけど必ず価値はあるから
プログラミングの棚にはなかったと思うんですけど、
とりあえず今日大学の図書館探してみます。
「ふつうのコンパイラをつくろう」の方は図書館にも置いてあったので。
160(2): 117 [sage] 2014/12/11(木) 17:45:33.30 ID:TxaNdaYp(3/4) AAS
ドラゴンブックは残念ながら大学の図書館にはありませんでしたが、
市内(他区)の図書館にはあるとのことなので取り寄せて読みます。
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著 ; 牛島和夫訳
コンパイラ / 中田育男著
169: 117 [sage] 2014/12/11(木) 21:35:13.25 ID:TxaNdaYp(4/4) AAS
>>161>文芸的なcobol+日本語ななでしこ?
cobolやなでしこは使ったことないのでわかりませんが、
私は英語を用いた言語よりはわかりやすいと思います。
コメント文での説明が要らないかどうかは作るものによりますけど。
>あるなら手にとって読んでみればいいのに
いろんな図書館に点々としてるそうで、
中にはどこにあるのかわからない図書館にある本だったりも・・・;
ちなみに、上げた24冊のうち私の工学部の校舎にある図書館に絞ると3冊しかないそうです。
>>162162(2): デフォルトの名無しさん [sage] 2014/12/11(木) 18:43:18.72 ID:tbxqmm74(1/3) AAS
>>160
中田先生の本は良い本(というか国内で学者が書いてる数少ない本)
買うかどうかとは別に読んで損はしない。
先生は多忙なのか執筆が遅いので最新を追うとちょっと遅れるけど
>>164中田先生の本読んでみます。
ドラゴンブックの方も取り寄せが届いたら読みます。
>>167
面白いならその2冊も読んでみます。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.225s*