鑑於此類型:創建一個簡單的語法camlp4擴展
type 'a variable = { name: string; mutable value: 'a }
我試圖創建一個語法擴展,將接受這種語法:
var foo = true
...並將其轉換爲:
let foo = { name = "foo"; value = true }
這裏是我的嘗試:
open Camlp4.PreCast
open Syntax
type 'a variable = { name: string; mutable value: 'a }
EXTEND Gram
expr: LEVEL "top"
[ [ "var"; v = a_LIDENT; "="; e = expr ->
<:expr< let $lid:v$ = { name= $`str:v$ ; value = $e$ } in $e$ >>
] ]
;
END
(我非常確定它需要在替換結束時使用$ e $作爲「剩餘」的一種表達方式,但是由於我們希望記錄的值字段對右邊的表達式的值 - 最初我並沒有結束$ E $那裏得到了同樣的錯誤)
我嘗試編譯:
ocamlc -I +camlp4 camlp4lib.cma -pp camlp4orf -c pa_var.ml
導致:
File "pa_var.ml", line 10, characters 50-51:
While expanding quotation "expr" in a position of "expr":
Parse error: "}" expected after [label_expr_list] (in [expr])
File "pa_var.ml", line 1, characters 0-1:
Error: Preprocessor error
我不知道爲什麼它似乎希望在記錄的名稱字段後面有一個「}」。 (否則,我在正確的軌道上嗎?)
我在這裏可能是錯的,但在<>') –
2012-01-08 01:43:40
@JeffMercado - 你是說它應該是:<:expr>? (這給出了相同的錯誤) –
aneccodeal
2012-01-08 03:17:31
說實話,我不知道這是什麼可能導致錯誤,它只是在我看來,表達式可能是一個主要因素在這個問題。 – 2012-01-08 03:24:18