[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