Изградете функция от граматиката OCaml

Опитвам се да създам анализатор от обща граматика
Но първо ме помолят да променя граматиката от това (A е началният символ):

(A,[(A,[C;B;C]);
    (A,[C]);
    (B,[A]);
    (C,[B])])

Към нещо, което изглежда така:

   (A,
   function
   | A -> [[C;B;C];[C]]
   | B -> [[C]]
   | C -> [[B]])


как да генерирам шаблон за съвпадение от информацията в списъка?
Съвпадение на шаблон (функция | шаблон | ... | шаблон) се дефинира от програмиста, как да се създаде такъв в движение с информация от списък, който има тази структура (A,[[C;B;C] ;[C]])::почивка?

Ако искате да разгледате по-голяма граматика, която има повече смисъл, вижте този въпрос.


person Miramontes Orlando    schedule 25.01.2013    source източник
comment
(Не мога да намеря въпрос тук.)   -  person Jeffrey Scofield    schedule 26.01.2013
comment
Чудя се как да генерирам тази структура от данни, даден списък, който изглежда така (A,[[C;B;C];[C]])::rest   -  person Miramontes Orlando    schedule 26.01.2013


Отговори (2)


Трябва да погледнете ocamllex и menhir, които са инструменти, предназначени за лексиране и анализиране.

person Thomash    schedule 26.01.2013
comment
Благодаря, знаех за тези инструменти, но не са това, което търся - person Miramontes Orlando; 26.01.2013

Добре, мисля, че мога да разбера въпроса ви. Структура от данни, започваща с функция, е функция! В OCaml функциите са първокласни обекти и можете да създавате нови, да ги съхранявате в структури от данни и т.н. За да запазите нещата чисти, не можете да получите достъп до текстовото представяне на функция (както можете на някои езици), но все пак можете да комбинирате функции по полезни начини.

Ето един мъничък пример. Функцията maketest приема стойност k и връща функция, която тества за k.

# let maketest k = fun x -> x = k;;
val maketest : 'a -> 'a -> bool = <fun>
# let t8 = maketest 8;;
val t8 : int -> bool = <fun>
# t8 3;;
- : bool = false
# t8 8;;
- : bool = true

Функцията union взема две тестови функции (като тези, генерирани от maketest) и връща функция, която тества обединението на двата набора от стойности:

# let union f g = fun x -> f x || g x;;
val union : ('a -> bool) -> ('a -> bool) -> 'a -> bool = <fun>
# let t812 = union t8 (maketest 12);;
val t812 : int -> bool = <fun>
# t812 8;;
- : bool = true
# t812 12;;
- : bool = true
# t812 14;;
- : bool = false
# 

Функцията sequence взема две тестови функции (като тези, генерирани от maketest) и тества за списък, започващ с ints, които съответстват на двете функции на свой ред.

# let sequence f g = function
  | []|[_] -> false
  | a :: b :: _ -> f a && g b;;
val sequence : ('a -> bool) -> ('a -> bool) -> 'a list -> bool = <fun>
# sequence (maketest 1) (maketest 4) [1;4;7];;
- : bool = true
# sequence (maketest 1) (maketest 4) [1;8;7];;
- : bool = false
# 

Не съм напълно сигурен, но мисля, че от вас се иска да създадете функции като тези за компонентите на вашата граматика. За да направите анализатор от функции като тази, ще трябва да проследите напредъка си през входния поток. Обичайният начин би бил функциите за анализиране да върнат оставащия (неанализиран) поток.

person Jeffrey Scofield    schedule 26.01.2013
comment
Разбирам мисълта ти. Имам нужда от още малко помощ. Перифразирах въпроса. - person Miramontes Orlando; 26.01.2013
comment
Ако приемем, че сте прочели новия въпрос... Виждам как мога да получа това, което искам с (забавно x -› f x ||...), но трябва да е сравнимо с (функция | .. | ..) . Не мисля, че можете да го сравните с (=) на вашия подход. - person Miramontes Orlando; 26.01.2013