「コンパイラ・スクリプトエンジン」相談室16 (648レス)
上下前次1-新
抽出解除 レス栞
121(2): デフォルトの名無しさん [sage] 2014/12/06(土) 17:17:29.59 ID:djm9MkQZ(1) AAS
演算子の優先順位はどうしてんの?
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の場合字句解析でトークン列に分解してくれて、
>>117117(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() ")"
}
にあるようにそのトークンの並びを書いて構文解析の定義をします。
なので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)
128(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-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.283s