我已經決定檢查FParsec並嘗試爲λ表達式編寫解析器。事實證明,渴望使得遞歸解析變得困難。我該如何解決這個問題?FParsec中的遞歸語法
代碼:
open FParsec
type λExpr =
| Variable of char
| Application of λExpr * λExpr
| Lambda of char * λExpr
let rec FV = function
| Variable v -> Set.singleton v
| Application (f, x) -> FV f + FV x
| Lambda (x, m) -> FV m - Set.singleton x
let Λ0 = FV >> (=) Set.empty
let apply f p =
parse
{ let! v = p
return f v }
let λ e =
let expr, exprR = createParserForwardedToRef()
let var = lower |> apply Variable
let app = tuple2 expr expr
|> apply Application
let lam = pipe2 (pchar 'λ' >>. many lower)
(pchar '.' >>. expr) (fun vs e ->
List.foldBack (fun c e -> Lambda (c, e)) vs e)
exprR := choice [
lam
app
var
(pchar '(' >>. expr .>> pchar ')')
]
run expr e
謝謝!
+1代碼中的希臘字符:) – Benjol 2011-05-31 10:46:32
好的,我終於下載FParsec :-) – 2011-06-01 01:46:42