Files
gf-core/lib/resource/doc/gfdoc/Prelude.html
2007-12-12 20:30:11 +00:00

223 lines
6.1 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META NAME="generator" CONTENT="http://txt2tags.sf.net">
<TITLE> The GF Prelude</TITLE>
</HEAD><BODY BGCOLOR="white" TEXT="black">
<P ALIGN="center"><CENTER><H1> The GF Prelude</H1>
<FONT SIZE="4">
<I>Last update: 2006-02-27 09:41:31 CET</I><BR>
</FONT></CENTER>
<P></P>
<HR NOSHADE SIZE=1>
<P></P>
<UL>
<LI><A HREF="#toc1">Strings, records, and tables</A>
<LI><A HREF="#toc2">Optional elements</A>
<LI><A HREF="#toc3">Infixes. prefixes, and postfixes</A>
<LI><A HREF="#toc4">Booleans</A>
<LI><A HREF="#toc5">High-level acces to Predef operations</A>
<LI><A HREF="#toc6">Lexer-related operations</A>
<LI><A HREF="#toc7">Miscellaneous</A>
</UL>
<P></P>
<HR NOSHADE SIZE=1>
<P></P>
<P>
Produced by
gfdoc - a rudimentary GF document generator.
(c) Aarne Ranta (<A HREF="mailto:aarne@cs.chalmers.se">aarne@cs.chalmers.se</A>) 2002 under GNU GPL.
</P>
<P>
This file defines some prelude facilities usable in all grammars.
</P>
<PRE>
resource Prelude = open (Predef=Predef) in {
oper
</PRE>
<P></P>
<A NAME="toc1"></A>
<H2>Strings, records, and tables</H2>
<PRE>
SS : Type = {s : Str} ;
ss : Str -&gt; SS = \s -&gt; {s = s} ;
ss2 : (_,_ : Str) -&gt; SS = \x,y -&gt; ss (x ++ y) ;
ss3 : (_,_ ,_: Str) -&gt; SS = \x,y,z -&gt; ss (x ++ y ++ z) ;
cc2 : (_,_ : SS) -&gt; SS = \x,y -&gt; ss (x.s ++ y.s) ;
cc3 : (_,_,_ : SS) -&gt; SS = \x,y,z -&gt; ss (x.s ++ y.s ++ z.s) ;
SS1 : Type -&gt; Type = \P -&gt; {s : P =&gt; Str} ;
ss1 : (A : Type) -&gt; Str -&gt; SS1 A = \A,s -&gt; {s = table {_ =&gt; s}} ;
SP1 : Type -&gt; Type = \P -&gt; {s : Str ; p : P} ;
sp1 : (A : Type) -&gt; Str -&gt; A -&gt; SP1 A = \_,s,a -&gt; {s = s ; p = a} ;
constTable : (A,B : Type) -&gt; B -&gt; A =&gt; B = \_,_,b -&gt; \\_ =&gt; b ;
constStr : (A : Type) -&gt; Str -&gt; A =&gt; Str = \A -&gt; constTable A Str ;
</PRE>
<P></P>
<P>
Discontinuous constituents.
</P>
<PRE>
SD2 = {s1,s2 : Str} ;
sd2 : (_,_ : Str) -&gt; SD2 = \x,y -&gt; {s1 = x ; s2 = y} ;
</PRE>
<P></P>
<A NAME="toc2"></A>
<H2>Optional elements</H2>
<P>
Missing form.
</P>
<PRE>
nonExist : Str = variants {} ;
</PRE>
<P></P>
<P>
Optional string with preference on the string vs. empty.
</P>
<PRE>
optStr : Str -&gt; Str = \s -&gt; variants {s ; []} ;
strOpt : Str -&gt; Str = \s -&gt; variants {[] ; s} ;
</PRE>
<P></P>
<P>
Free order between two strings.
</P>
<PRE>
bothWays : Str -&gt; Str -&gt; Str = \x,y -&gt; variants {x ++ y ; y ++ x} ;
</PRE>
<P></P>
<P>
Parametric order between two strings.
</P>
<PRE>
preOrPost : Bool -&gt; Str -&gt; Str -&gt; Str = \pr,x,y -&gt;
if_then_Str pr (x ++ y) (y ++ x) ;
</PRE>
<P></P>
<A NAME="toc3"></A>
<H2>Infixes. prefixes, and postfixes</H2>
<P>
Fixes with precedences are defined in <A HREF="Precedence.html">Precedence</A>.
</P>
<PRE>
infixSS : Str -&gt; SS -&gt; SS -&gt; SS = \f,x,y -&gt; ss (x.s ++ f ++ y.s) ;
prefixSS : Str -&gt; SS -&gt; SS = \f,x -&gt; ss (f ++ x.s) ;
postfixSS : Str -&gt; SS -&gt; SS = \f,x -&gt; ss (x.s ++ f) ;
embedSS : Str -&gt; Str -&gt; SS -&gt; SS = \f,g,x -&gt; ss (f ++ x.s ++ g) ;
</PRE>
<P></P>
<A NAME="toc4"></A>
<H2>Booleans</H2>
<PRE>
param Bool = True | False ;
oper
if_then_else : (A : Type) -&gt; Bool -&gt; A -&gt; A -&gt; A = \_,c,d,e -&gt;
case c of {
True =&gt; d ; ---- should not need to qualify
False =&gt; e
} ;
andB : (_,_ : Bool) -&gt; Bool = \a,b -&gt; if_then_else Bool a b False ;
orB : (_,_ : Bool) -&gt; Bool = \a,b -&gt; if_then_else Bool a True b ;
notB : Bool -&gt; Bool = \a -&gt; if_then_else Bool a False True ;
if_then_Str : Bool -&gt; Str -&gt; Str -&gt; Str = if_then_else Str ;
onlyIf : Bool -&gt; Str -&gt; Str = \b,s -&gt; case b of {
True =&gt; s ;
_ =&gt; nonExist
} ;
</PRE>
<P></P>
<P>
Interface to internal booleans
</P>
<PRE>
pbool2bool : Predef.PBool -&gt; Bool = \b -&gt; case b of {
Predef.PFalse =&gt; False ; Predef.PTrue =&gt; True
} ;
init : Tok -&gt; Tok = Predef.tk 1 ;
last : Tok -&gt; Tok = Predef.dp 1 ;
</PRE>
<P></P>
<A NAME="toc5"></A>
<H2>High-level acces to Predef operations</H2>
<PRE>
isNil : Tok -&gt; Bool = \b -&gt; pbool2bool (Predef.eqStr [] b) ;
ifTok : (A : Type) -&gt; Tok -&gt; Tok -&gt; A -&gt; A -&gt; A = \A,t,u,a,b -&gt;
case Predef.eqStr t u of {Predef.PTrue =&gt; a ; Predef.PFalse =&gt; b} ;
</PRE>
<P></P>
<A NAME="toc6"></A>
<H2>Lexer-related operations</H2>
<P>
Bind together two tokens in some lexers, either obligatorily or optionally
</P>
<PRE>
oper
glue : Str -&gt; Str -&gt; Str = \x,y -&gt; x ++ BIND ++ y ;
glueOpt : Str -&gt; Str -&gt; Str = \x,y -&gt; variants {glue x y ; x ++ y} ;
noglueOpt : Str -&gt; Str -&gt; Str = \x,y -&gt; variants {x ++ y ; glue x y} ;
</PRE>
<P></P>
<P>
Force capitalization of next word in some unlexers
</P>
<PRE>
capitalize : Str -&gt; Str = \s -&gt; CAPIT ++ s ;
</PRE>
<P></P>
<P>
These should be hidden, and never changed since they are hardcoded in (un)lexers
</P>
<PRE>
BIND : Str = "&amp;+" ;
PARA : Str = "&amp;-" ;
CAPIT : Str = "&amp;|" ;
</PRE>
<P></P>
<A NAME="toc7"></A>
<H2>Miscellaneous</H2>
<P>
Identity function
</P>
<PRE>
id : (A : Type) -&gt; A -&gt; A = \_,a -&gt; a ;
</PRE>
<P></P>
<P>
Parentheses
</P>
<PRE>
paren : Str -&gt; Str = \s -&gt; "(" ++ s ++ ")" ;
parenss : SS -&gt; SS = \s -&gt; ss (paren s.s) ;
</PRE>
<P></P>
<P>
Zero, one, two, or more (elements in a list etc)
</P>
<PRE>
param
ENumber = E0 | E1 | E2 | Emore ;
oper
eNext : ENumber -&gt; ENumber = \e -&gt; case e of {
E0 =&gt; E1 ; E1 =&gt; E2 ; _ =&gt; Emore} ;
}
</PRE>
<P></P>
<!-- html code generated by txt2tags 2.3 (http://txt2tags.sf.net) -->
<!-- cmdline: txt2tags -thtml -\-toc ../prelude/Prelude.txt -->
</BODY></HTML>