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의 forest-example에서 파생 된 최소 예입니다. forest.ml 이제 다음 print_forest 기능이
{
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)}
:
grammarfile forest_parser.dyp는 포함
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
그리고 당신은 numeri 물고기, 양, 고양이 (들) 등이 무엇인지를 결정할 수 있습니다.
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