[nem-pl] Re: =?us-ascii:iso-8859-2:utf-8?Q?=5Bnem-p?= =?us-ascii:iso-8859-2:utf-8?Q?l=5D_Dalej_o_sk=B3adni_rozszerze=F1?=

Michal Moskal malekith at pld-linux.org
Mon Nov 3 20:17:12 CET 2003


On Mon, Nov 03, 2003 at 05:25:27PM +0100, Lukasz Kaiser wrote:
> Nie, nie, nie. Definicja jest prosta.
> Po pierwsze zakladamy ze kazda regula gramatyki jest w dwoch wersjach,
> obecnej oraz B, czyli jest expr i Bexpr itd., oczywiscie wszystkie
> rekurencyjne wywolania z Bexpr ida do Bexpr lub Bcosinnego.

IMHO nie jest potrzebna żadna równoległa gramatyka. Wystarczy zrobić coś
takiego:

expr :=
  ....
  <[ expr ]>
  $( expr )

pattern :=
  ...
  <[ expr ]>

Plus ewentualne <[ ID : expr ]> etc.

W parsedtree.n dopisujemy:

  | E_quote { ex : Expr; }       (* <[ ... ]> *)
  | E_unquote { ex : Expr; }     (* $( ... ) *)

oraz:

  | P_quoted_expr { ex : Expr; }.

(nazwy do uzgodnienia).

Teraz zauważamy, że jednyny fragment kodu, który chodzi po wyrażeniach
(więc i patternach) jest w tyexpr.n. Więc tam po prostu:

ty_expr (ctx, e) =
  ... 
  | E_unqute => error
  | E_quote (e) => ty_expr (ctx, quote_expr (e))

quote_expr (e):
  | E_ref (x) => 
    E_call (E_ref ("E_ref"), List.cons (E_literal (L_string (x))))
  | E_if_then_else (e1, e2, e3) => 
    E_call (E_ref ("E_if_then_else"), List.cons (quote_expr (e1), quote_expr (e2), quote_expr (e3)))
  | ...
  | E_unquote (e) => e
  | E_quote => error
  
itd. 

Fajnie by to było napisać jako rozszerzenie :-) Tylko trzeba to najpierw
napisać, żeby móc pisać rozszerzenia.

Aha, podobna funkcja byłaby dla patternów, klas, typów i czego tam
jeszcze.

Mówię z sensem?

-- 
: Michal Moskal :: http://www.kernel.pl/~malekith : GCS {C,UL}++++$ a? !tv
: When in doubt, use brute force. -- Ken Thompson : {E-,w}-- {b++,e}>+++ h




More information about the devel-pl mailing list