2013-02-19 5 views
0

Я хотел бы проанализировать «[a; b; c; d; e; f; g]» как «a :: b :: c :: d :: e :: f :: g :: []» В моей части моего синтаксического анализа у меня естьOCaml Разбор списка

listOps: 
    | combOps COLONCOLON listOps { Bin($1,Cons,$3) } 
    | combOps SEMI listOps  { Bin($1,Cons,$3) } 
    | combOps     { $1 } 
; 

и я это дальше.

| LBRAC RBRAC    { NilExpr } 
    | LBRAC listOps RBRAC  { $2 } 

Но я не знаю, как заставить его прочитать список между «[» и «]», как имеющие «:: []» в конце. Любые идеи?

ответ

2

Ваша грамматика, как указано, не совсем мне подходит. По существу он обрабатывает :: и ; одинаково. Таким образом, он будет обрабатывать [a::b] и [a;b] как то же самое. Если вы выясните, как обращаться с двумя случаями по-разному, вы, вероятно, найдете дескриптор места [] в конце списка, указанного с помощью ::.

В качестве побочного комментария, если вы разрешите a :: b :: [], вы разрешаете правую сторону :: быть непустым списком. Таким образом, вы можете хотеть, чтобы a :: [b] разрешалось, как в OCaml. Или, может быть, вы предпочтете этого, это ваша грамматика!

Смежные вопросы