我想处理dypgen中的一些歧义。我在手册中发现了一些内容,我想知道,我该如何使用它。 在手动点5.2“上的符号模式匹配”有一个例如:dypgen中的模式匹配
expr:
| expr OP<"+"> expr { $1 + $2 }
| expr OP<"*"> expr { $1 * $2 }
OP与“+”或匹配的“*”,我的理解。我也在那里找到:
这些模式可以是任何Caml模式(但没有关键字时)。 例如这是可能的:
expr: expr<(Function([arg1;arg2],f_body)) as f> expr { some action }
于是,我就放在那里一些其他的表情,但我不明白,发生了什么。如果我放在那里printf
它输出匹配的字符串的值。但是,如果我在那里放入(fun x -> printf x)
,那在我看来就像printf
一样,dypgen会抱怨语法错误并指向表达式的结尾。如果我把Printf.printf
放在那里,它会抱怨Syntax error: operator expected
。如果我把它放在那里(fun x -> Printf.printf x)
它说:Lexing failed with message: lexing: empty token
这些不同的错误消息是什么意思?
最后,我想查找一个哈希表中的东西,如果值在那里,但我不知道,如果这是可能的话。它是不是可能?
编辑:派生自森林示例从dypgen演示的最小示例。
的grammarfile forest_parser.dyp包含:
{
open Parse_tree
let dyp_merge = Dyp.keep_all
}
%start main
%layout [' ' '\t']
%%
main : np "." "\n" { $1 }
np:
| sg {Noun($1)}
| pl {Noun($1)}
sg: word <Word("sheep"|"fish")> {Sg($1)}
sg: word <Word("cat"|"dog")> {Sg($1)}
pl: word <Word("sheep"|"fish")> {Pl($1)}
pl: word <Word("cats"|"dogs")> {Pl($1)}
/* OR try:
sg: word <printf> {Sg($1)}
pl: word <printf> {Pl($1)}
*/
word:
| (['A'-'Z' 'a'-'z']+) {Word($1)}
的forest.ml现已以下print_forest功能:
let print_forest forest =
let rec aux1 t = match t with
| Word x
-> print_string x
| Noun (x) -> (
print_string "N [";
aux1 x;
print_string " ]")
| Sg (x) -> (
print_string "Sg [";
aux1 x;
print_string " ]")
| Pl (x) -> (
print_string "Pl [";
aux1 x;
print_string " ]")
in
let aux2 t = aux1 t; print_newline() in
List.iter aux2 forest;
print_newline()
而且parser_tree.mli包含:
type tree =
| Word of string
| Noun of tree
| Sg of tree
| Pl of tree
然后你可以确定,什么数字鱼,羊,猫等。
sheep or fish can be singular and plural. cats and dogs cannot.
fish.
N [Sg [fish ] ]
N [Pl [fish ] ]
你如何解析你的函数? – Lhooq
我用dypgen的演示为出发点,并使用这些makefile文件...语法是在.dyp-文件和它的作用: .dyp.ml: \t path_to_dypgen $ < \t ocamlc path_to_dyplib -C $ *。mli 我想现在,我被该构造函数的那个例子的模式语法困惑了。其他具有类型构造函数的ocaml模式可以工作。 (当然,printf不是一个模式,也许是它构建到dypgen中)但是我从来没有在手册中看到过类似的构造函数。 – gwf
你可以添加一个你做过的最简单的例子吗? – Lhooq