Я хочу обрабатывать некоторые двусмысленности в 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
Что означают эти разные сообщения об ошибках?
В конце концов, я хотел бы найти что-то в хэш-таблице, если значение там, но я не знаю, если это возможно. Это или не возможно?
EDIT: минимальный пример, полученный из примера леса из dypgen-demos.
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