I created a syntax extension that allow the definition of a type as
type.yjson type_name {
/* type_declaration */
}
to be able to build a record value directly from a json file. The syntax extension insert a module and the function necessary to do so. Until here, no problem. The syntax extension do exactly what I wanted.
I start having some issue if I want to use "yjson" at some other place in my code (i.e:function parameter).
Here what I tried:
EXTEND Gram
str_item:
[
[ KEYWORD "type"; KEYWORD "."; "yjson"; tdl_raw = type_declaration ->
Here the error I get when I use "yjson" as a function parameter
[fun_binding] expected after [ipatt] (in [let_binding])
I don't really understand what happen here. It doesn't seems like the rule have been match, so why do I get a parse error ?
I do not perfectly understand the P4's mechanism around this, but [ [ "blahblah" -> ...
makes blahblah
as a new keyword of the language, so you can no longer use blahblah
as a function argument.
To see this, try preprocess your pa_*.ml by camlp4of and see how "blahblah"
is expanded to Gram.Skeyword "blahblah"
. It seems that this Skeyword _
is passed to Structure.using
via Insert.insert
of P4 and the string is registered as a new keyword.
To keep yjson
usable as a normal variable, use id = LIDENT
instead of "yjson"
in your rule, then check id
's content is "yjson"
or not in your action.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With