On Sat, 2007-08-25 at 13:12 -0700, Erick Tryzelaar wrote:
> I'm playing around with the dssl support and it's really cool. I'm
> running into some issues though. I'm toying around with the idea of
> list comprehensions, but I'm having trouble actually getting it
> implemented. Here's my toy code:
>
> comprehensions.flx:
> syntax foo {
> satom := [ sexpr ] =># (List::list _2);
You need:
satom := lqsb sexpr rsqb =># ....
The [ ] brackets are meta-symbols, (to be) used for parameterised
nonterminals like:
expr[plus] := expr[plus] + expr[mult] =># ...
where plus, mult are Dypgen priorities. However Dypgen is bugged with
respect to run time priorities, so this feature is incomplete and
unused. Look at the base grammar:
opt_prio:
| LSQB NAME RSQB { `Priority (snd $2) }
| { `Default }
dyprod:
| opt_private NAME opt_prio COLONEQUAL dyalts SEMI
for example.
If you look further in lpsrc/flx_parser.ipk you will find replacement
names for the used metasymbols, as well as the names of base
nonterminals, here:
///////////////////////////////////////////////////////
/* low level non terminals */
%constructor Obj_sexpr %for sname sliteral
/* literals */
%constructor Obj_sexpr %for sinteger sfloat sstring scstring strue
sfalse
%constructor Obj_sexpr %for strint strfloat strstring strtrue strfalse
/* patterns */
%constructor Obj_sexpr %for sintegral
/* tokens replacements for special symbols used in productions */
%constructor Obj_sexpr %for star plus quest suser10token sident
%constructor Obj_sexpr %for suserlbtoken suserrbtoken
%constructor Obj_sexpr %for lbrace rbrace lpar rpar lsqb rsqb
%constructor Obj_sexpr %for ssemi comma colon vbar
/* nothing*/
%constructor Obj_sexpr %for sepsilon
%constructor Obj_sexpr %for strepsilon
/////////////////////////////////////////////////
and also here:
/////////////////////////////////////
/* identifiers which aren't keywords */
sname: NAME { 0,slift (fst $1),Sstring (snd $1) }
/*
replacements for * + and ? to be used in productions,
since these symbols have special meansings as
list, non-empty list, and optional respectively
*/
star: STAR { 0,slift $1,Snull }
plus: PLUS { 0,slift $1,Snull }
quest: QUEST { 0,slift $1,Snull }
sident: IDENT { 0,slift $1,Snull }
lbrace: LBRACE { 0,slift $1,Snull }
rbrace: RBRACE { 0,slift $1,Snull }
lpar: LPAR { 0,slift $1,Snull }
rpar: RPAR { 0,slift $1,Snull }
lsqb: LSQB { 0,slift $1,Snull }
rsqb: RSQB { 0,slift $1,Snull }
ssemi: SEMI { 0,slift $1,Snull }
comma: COMMA { 0,slift $1,Snull }
colon: COLON { 0,slift $1,Snull }
vbar: VBAR { 0,slift $1,Snull }
strue: TRUE { 0,slift $1,Snull }
sfalse : FALSE { 0,slift $1,Snull }
strtrue: TRUE { 0,slift $1,Sstring "true" }
strfalse : FALSE { 0,slift $1,Sstring "false" }
/*
a definite non-terminal for a sequence of no tokens,
since the production syntax cannot parse an empty
production at the moment
*/
sepsilon: | {0,dummysr,Snull }
strepsilon: | {0,dummysr,Sstring "" }
..... (more in the real file)
//////////////////////////////////////
--
John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: http://felix.sf.net
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language