On 05/04/2009, at 12:57 AM, Emmanuel Onzon wrote:

>
> The build system is now doing this:
> [...]
> checking build/test/regress/rt/rt-1.01.30-0: ok
>  * build/bin/flx.py --test=build        : build/test/regress/rt/ 
> rt-1.01.31-0.flx -> build/test/regress/rt/rt-1.01.31-0.so
> checking build/test/regress/rt/rt-1.01.31-0.so: ok
>  * build/bin/flx.py --test=build        : build/test/regress/rt/ 
> rt-1.01.31-0.flx -> build/test/regress/rt/rt-1.01.31-0
> checking build/test/regress/rt/rt-1.01.31-0: ok
>  * build/bin/flx.py --test=build        : build/test/regress/rt/ 
> rt-1.01.32-0.flx -> build/test/regress/rt/rt-1.01.32-0.so
> checking build/test/regress/rt/rt-1.01.32-0.so: ok
>  * build/bin/flx.py --test=build        : build/test/regress/rt/ 
> rt-1.01.32-0.flx -> build/test/regre
> [...]
>
>
> Running regression tests :)
>

OK, so now we have it all working again it is time to break it again :)

The hope for the new version of Dypgen is we can get priorities working.
The goal is to allow stuff like the following use case:

"The end user wishes to add /\ and \/ binary operators to the grammar,
these are called Wedge and Vee, and are used for logical and and logical
or, for gcd and lcm, and also in lattices and other math stuff where
there is some concept of infinum and supremum. The precedence
should be higher than logical and/or but lower than + and - somewhere"

To make this work, the whole expression grammar needs to be rewritten
with priority information instead of using  (tail) recursion. And then  
we
have to parse the rewritten grammar. If that works, then we can add new
binary operators (since we already have, just to load Felix standard
grammar).

The syntax I used before was something like:


        nt [pri] = rest of the production =># scheme action ;

We would also require

        order pri1 < pri2 < pri3;

or something. This does NOT handle arbitrary priorities, just a linear  
ordering,
but it does support insertion. (The transitive closure is implied).

Unfortunately this makes a real mess of expression RHS. You have to  
write:

        expr [term] = expr[term] + expr[<term];

to get left associativity and the right precendences (or is that right  
assoc ?)

This is too messy, so we might do:

        def sterm = expr[term];

        sterm = sterm + <sterm;

where <expr[term] is shorthand for expr[<term]

But this too is messy ..

The problem goes away if non-terminals have unique priorities,
in which case the priority name can just be used in lieu of the non- 
terminal.


--
john skaller
skal...@users.sourceforge.net





------------------------------------------------------------------------------
_______________________________________________
Felix-language mailing list
Felix-language@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/felix-language

Reply via email to