メンヒル初心者です。OCaml によく似た自分の言語で OCaml をタプル パターンのように解析する方法を考えています。
たとえば、式let a,b,c = ...
では、
のa, b, c
ように解析する必要がありますTuple (Var "a", Var "b", Var "c")
。
ただし、次のパーサーの定義では、上記の例は として解析されTuple (Tuple (Var "a", Var "b"), Var "c")
ます。次の定義を修正して、ocaml のようなパターンを解析する方法を考えています。
OCaml の parser.mly を確認しましたが、それを実装する方法がわかりません。私の定義は OCaml の定義に似ていると思います... 彼らはどんな魔法を使っているのでしょうか?
%token LPAREN
%token RPAREN
%token EOF
%token COMMA
%left COMMA
%token <string> LIDENT
%token UNDERBAR
%nonassoc below_COMMA
%start <Token.token> toplevel
%%
toplevel:
| p = pattern EOF { p }
pattern:
| p = simple_pattern { p }
| psec = pattern_tuple %prec below_COMMA
{ Ppat_tuple (List.rev psec) }
simple_pattern:
| UNDERBAR { Ppat_any }
| LPAREN RPAREN { Ppat_unit }
| v = lident { Ppat_var v }
| LPAREN p = pattern RPAREN { p }
pattern_tuple:
| seq = pattern_tuple; COMMA; p = pattern { p :: seq }
| p1 = pattern; COMMA; p2 = pattern { [p2; p1] }
lident:
| l = LIDENT { Pident l }
結果は次のとおりです。
[~/ocaml/error] menhir --interpret --interpret-show-cst ./parser.mly
File "./parser.mly", line 27, characters 2-42:
Warning: production pattern_tuple -> pattern_tuple COMMA pattern is never reduced.
Warning: in total, 1 productions are never reduced.
LIDENT COMMA LIDENT COMMA LIDENT
ACCEPT
[toplevel:
[pattern:
[pattern_tuple:
[pattern:
[pattern_tuple:
[pattern: [simple_pattern: [lident: LIDENT]]]
COMMA
[pattern: [simple_pattern: [lident: LIDENT]]]
]
]
COMMA
[pattern: [simple_pattern: [lident: LIDENT]]]
]
]
EOF
]