我想使用 Menhir 解析器在 OCaml 中实现以下语法。
应该有四个不同的语句一个接一个地出现,但是,其中任何三个都可能丢失。因此,任何程序都至少包含这些语句中的一个,但可以包含更多以特定顺序出现的语句。
这是语法:
main = A (B) (C) (D)
| (A) B (C) (D)
| (A) (B) C (D)
| (A) (B) (C) D
是否可以用更简洁的表示来表达它?
这是parser.mly
此语法的示例:
%token <char> ACHAR BCHAR CCHAR DCHAR
%token EOF
%start <char option list> main
%type <char> a b c d
%%
main:
a option(b) option(c) option(d) { [Some($1); $2; $3; $4] }
| option(a) b option(c) option(d) { [$1; Some($2); $3; $4] }
| option(a) option(b) c option(d) { [$1; $2; Some($3); $4] }
| option(a) option(b) option(c) d { [$1; $2; $3; Some($4)] }
| EOF { [] }
a:
ACHAR { $1 } (* returns 'A' *)
b:
BCHAR { $1 } (* returns 'B' *)
c:
CCHAR { $1 } (* returns 'C' *)
d:
DCHAR { $1 } (* returns 'D' *)
对于这种情况,menhir 会产生警告:
Warning: production option(a) -> a is never reduced.
Warning: production option(d) -> d is never reduced.
和A B C D
, A
, A C
,B D
等情况不匹配。如何改进语法/解析器实现以解决此问题?