김용기
가입: 2014년 9월 30일 올린 글: 11
|
올려짐: 2014년10월23일 10:33 주제: [참고] 테스트용 T(reasure) 파서 |
|
|
안녕하세요?
테스트용으로 만든 간단한 파서를 공개합니다.
tParser.mly 코드에서 모듈명만 고치셔서 쓰면 됩니다.
저의 경우 숙제 파일이 hw4_2.ml 이기 때문에
코드: | %type <Hw4_2.map> parse_map |
이지만 파일명이 Hw4.ml이라면
코드: | %type <Hw4.map> parse_map |
으로 바꿔주시면 됩니다.
컴파일
코드: | $ ocamllex tLexer.mll
$ ocamlyacc tParser.mly
|
사용하기
코드: | let parse_map s =
let lexbuf = Lexing.from_string s in
TParser.parse_map TLexer.start lexbuf
let m1 = parse_map "a|b"
let m2 = (Branch (End (NameBox "a"), End (NameBox "b")))
let _ = print_string (string_of_bool (m1 = m2))
(* "true" 출력 *)
|
tLexer.mll
코드: | {
open TParser
exception Eof
exception LexicalError
let verbose1 s = (* (print_string s; print_newline(); s) *) s
let verbose2 s = (* (print_string s; print_newline()) *) ()
}
let blank = [' ' '\n' '\t' '\r']+
let name = ['a'-'z']
rule start =
parse blank { start lexbuf }
| name { let id = verbose1 (Lexing.lexeme lexbuf) in ID id }
| "*" { verbose2 "*"; STAR}
| "]" { verbose2 "]"; RB}
| "[" { verbose2 "["; LB}
| "|" { verbose2 "|"; BAR}
| "(" { verbose2 "("; LP}
| ")" { verbose2 ")"; RP}
| eof { verbose2 "eof"; EOF}
| _ {raise LexicalError}
|
tParser.mly
코드: | %token <string> ID
%token STAR LB RB BAR
%token LP RP
%token EOF
%start parse_map
%type <Hw4_2.map> parse_map
%%
parse_map: map EOF { $1 }
;
map:
LP map RP { $2 }
| ID { End (NameBox $1) }
| STAR { End (StarBox) }
| map BAR map { Branch ($1, $3) }
| LB ID RB map { Guide ($2, $4) }
;
%%
|
|
|