Menhir パーサーを使用して OCaml で次の文法を実装したいと思います。
4 つの異なるステートメントが次々に来るはずですが、そのうちの 3 つが欠落している可能性があります。したがって、どのプログラムにもこれらのステートメントが少なくとも 1 つ含まれていますが、特定の順序でさらに多くのステートメントを含めることができます。
文法は次のとおりです。
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
は一致しません。これを修正するために文法/パーサーの実装を改善するにはどうすればよいですか?