Парсер OCaml и структура грамматики
Я разрабатывал парсер для крошечного языка, синтаксис которого следующий
P::= 1 | 0 | P+P | P and P | P wait(d) P
Вот код, который я написал в Ocaml camlp4
action:
[
["act"; a = LIDENT -> Act(a)]
|
["coact"; a = LIDENT -> Act2(a)]
];
proc:
[
[ "ZERO" -> Zero]
| RIGHTA
["."; l = action; p = SELF -> Now(l,p)]
| RIGHTA
[":"; l = action; p = SELF -> Delay(l,p)]
| LEFTA
[p1 = SELF; "+"; p2 = SELF -> Plus(p1,p2)]
|RIGHTA
[p1 = SELF; "WAIT"; "("; d = INT; ")"; p2 = SELF -> Wait(p1,d,p2)]
|
[ x = UIDENT -> Proc(x)]
];
Но, к сожалению, парсер не разбирает такие строки, как
.act abort WAIT(4) :act close
потому что правило для конструкции WAIT ожидает в качестве первого аргумента proc.
Как я могу это исправить?