私は単純なコンパイラ プログラムに 1 日を費やしましたが、まだこの機能を理解するのに苦労しています。
let rec expression tokens =
let (trm, tokens') = term tokens in
ここで (trm, tokens') はタプルですが、term は関数ですか、それとも変数ですか? タプル = 2 つの変数または関数
expTail trm tokens'
and
expTail trm tokens =
match tokens with
Tokenizer.PlusTok::tokens' ->
let (trm', tokens'') = term tokens' in expTail (Plus(trm, trm')) tokens''
| Tokenizer.MinusTok::tokens' ->
let (trm', tokens'') = term tokens' in expTail (Minus(trm, trm')) tokens''
| _ -> (trm, tokens)
この行はどういう意味ですか?何も呼ばないようです。そして、なぜ (trm', tokens'') ではなく (trm', tokens'') なのか
and
term tokens = let (trm, tokens') = factor tokens in termTail trm tokens'
この行の意味もよくわかりません。
and
termTail trm tokens =
match tokens with
Tokenizer.TimesTok::tokens' ->
let (trm', tokens'') = factor tokens' in termTail (Times(trm, trm')) tokens''
| Tokenizer.DivTok::tokens' ->
let (trm', tokens'') = factor tokens' in termTail (Div(trm, trm')) tokens''
| Tokenizer.ModTok::tokens' ->
let (trm', tokens'') = factor tokens' in termTail (Mod(trm, trm')) tokens''
| _ -> (trm, tokens)
and
factor tokens =
match tokens with
Tokenizer.LParenTok::tokens' ->
let (expr, tokens'') = expression tokens' in
(match tokens'' with
Tokenizer.RParenTok::tokens''' -> (expr, tokens''')
| _ -> raise (Syntax "Bad factor, failed to find )\n"))
| (Tokenizer.IntTok i)::tokens' -> (Bits i, tokens')
| _ -> raise (Syntax ("Bad factor."))
みんなありがとう!