純粋に学問的な演習として、ANTLRまたはlex/yaccを使用せずに、再帰的降下パーサをゼロから作成しています。再帰的な降下構文解析プログラムをゼロから書くには?
数式を同等のASTに変換する簡単な関数を書いています。
// grammar
type expr =
| Lit of float
| Add of expr * expr
| Mul of expr * expr
| Div of expr * expr
| Sub of expr * expr
// tokens
type tokens =
| Num of float
| LParen | RParen
| XPlus | XStar | XMinus | XSlash
let tokenize (input : string) =
Regex.Matches(input.Replace(" ", ""), "\d+|[+/*\-()]")
|> Seq.cast<Match>
|> Seq.map (fun x -> x.Value)
|> Seq.map (function
| "+" -> XPlus
| "-" -> XMinus
| "/" -> XSlash
| "*" -> XStar
| "(" -> LParen
| ")" -> RParen
| num -> Num(float num))
|> Seq.to_list
ので、tokenize "10 * (4 + 5) - 1"
戻り、次のトークンストリーム:私は以下の持っている
[Num 10.0; XStar; LParen; Num 4.0; XPlus; Num 5.0; RParen; XMinus; Num 1.0]
この時点で、私は、演算子の優先順位についてのASTにトークンストリームをマッピングしたいと思います:
Sub(
Mul(
Lit 10.0
,Add(Lit 4.0, Lit 5.0)
)
,Lit 1.0
)
しかし、私は空白を描いています。私はパーサーを一から書いたことが一度もありませんし、原則としてどのように始めるべきかも分かりません。
トークンストリームを代表的なASTに変換するにはどうすればよいですか?
どのような偶然です!私はちょうどF#でパーサーを書くためのプロジェクトを作成していた!究極のリファレンス=ドラゴンブック。 –
http://stackoverflow.com/a/2336769/120163 –