JavaCCメモ
今日のメモ
SKIP :
{
" "|"\r"
}
SKIP : は読み飛ばす文字の指定。行指向じゃない場合は、"\n"も加える。
TOKEN :
{
< ADDOP: "+" >
| < SUBOP: "-" >
(省略)
| < LITERAL: (["0"-"9"])+ >
| < NL: "\n" >
}
TOKENで、必要なトークンを指定。Verilogでも使えそうだ。上手く[]を取れば、バス接続、一気抜き出しとかできるのか。
とりあえず、電卓動いたけどソースの意味がわからない。
BNFによる電卓の式表記
<加算式> ::= <乗算式> ( ("+"|"-") <乗算式> ) * (1)
<乗算式> ::= <基本式> ( ("*"|"/") <基本式> ) * (2)
<基本式> ::= 定数 | "(" <加算式> ")" (3)
いきなりBNFわかんない。
なんとなくわかっていても、ちゃんと説明しろって言われると困る、そんなレベルだな。
とりあえずグーグルだ。
ここをみて、* が、0回以上の繰り返しであることを知る。(1)は加算式の定義は「乗算式同士を+か-でつないだもの」ってこと。(2)は乗算式の定義は基本式を*か/でつなげた物。って事か。
(3)が難しいな。定数(5とか256とか)は基本式で、()の中の加算式も定数ですよ。って事だな。5も(2+128)も基本式。
()の中に乗算式が来たときは、どうなるんだ。(3 * 5)とか。とりあえず、さっきの電卓プログラムで試してみると
D:\home\study\javacc\calc>java Calc
(3 * 4)
result= 12.
ちゃんと計算してるな。えっと、加算式が、乗算式同士の0回以上の和だから、そこで処理できているのか。
ムツカシー。
こんなレベルで、自分ルールで構文解析できるのかな。30過ぎたら構文解析ダメなのかも。
The comments to this entry are closed.


Comments