Hi Christian,
this seems like a correct implementation:
...
unary
: MINUS unary -> ^(NEGATION unary)
| PLUS unary -> unary
| term
;
...
The rest strays as before, only PLUS and MINUS are new tokens.
Von: Christian Lerch [mailto:[email protected]]
Gesendet: Montag, 17. Januar 2011 13:14
An: [email protected]; Richard Andrysek
Betreff: Re: [antlr-interest] WG: Question to the tree grammer
Hi Richard,
I also had a fierce fight with unary operators, although in the context of
juxtaposition (which allows to ellide the * and write e.g. 2x instead of 2*x).
Please take a look at my small but tested grammar module that addresses this
problem.
It implements 5 precedence levels for
1. binary +, - (left-assoc)
2. multiplication (left-assoc)
3. unary +, -
4. juxtaposition interpreted as multiplication (left-assoc)
5. exponentiation (right-assoc)
A little bit anoying with this grammar is the fact, that the multiplication
implied by juxtaposition has precedence over normal multiplication.
On the other hand this can also be viewed as a feature, cause it allows you to
write e.g. 1/a b which results in the same AST as 1/(a*b)
Of course you can drop this feature altogether by simply deleting rule arithSec
and substituting all references by arithPrim.
Best wishes,
Chris
/*
Arithmetic expression grammar
with 5-level operator precedence and associativity
with handling of unary minus and unary plus
with juxtaposition mapped to multiplication
without bracketedExpr:
unnecessary parenthesis can be removed later by the code generator
*/
parser grammar ArithExpr2Parser;
options {
language = Java;
output = AST;
tokenVocab = ArithExpr2Lexer;
}
tokens {
NEG;
PAREN;
TIMES;
}
formulae: arithExpr EOF
;
arithExpr: arithTerm ( (PLUS^|MINUS^) arithTerm )*
;
arithTerm: arithFact ( (MULT^|DIV^) arithFact )*
;
arithFact: MINUS arithSec -> ^(NEG arithSec)
| PLUS! arithSec
| arithSec
;
arithSec: (arithPrim -> arithPrim)
(p=arithPrim -> ^(TIMES $arithSec $p))*
;
arithPrim: arithAtom ( POWER^ arithPrim )?
;
arithAtom: IDENT
| NUMBER
| LPAREN arithExpr RPAREN -> ^(PAREN arithExpr)
;
Am 17.01.2011 12:13, schrieb Richard Andrysek:
I want to switch from yacc. So I've looked on Videos from Scott
Stanchfield <http://vimeo.com/user566590> <http://vimeo.com/user566590> ,
especially on Part9 about a
tree grammar.
I've found a problem with an unary operator. The Interpreter in Eclipse
works fine, but the grammar tree not.
It simply can't accept things like this:
-5 - - + - 4
I've attached also my files. Is there a way, how can I ask somebody
else, than me? I assume, it is something with left/right association, is
it?
Thank you for hints
Richard
List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address
--
km-works | Ing. Christian Lerch KG
Geschäftsführer: Christian Lerch · FN: 249408 b, LG Wien · UID: ATU57985808
Tel: +43 (720) 616 400 · e-mail: [email protected]
Die Information in dieser E-Mail-Nachricht samt Anlagen ist vertraulich. Die
Kenntnisnahme und Verwendung der hier enthaltenen Informationen ist nur
denjenigen Personen gestattet, an die diese Kommunikation adressiert ist
und/oder die zur Kenntnisnahme und Verwendung dieser Daten ausdrücklich
ermächtigt wurden. Sollten Sie diesem Personenkreis nicht angehören, werden Sie
hiemit davon in Kenntnis gesetzt, dass jegliche Weiter- und Wiedergabe,
Vervielfältigung, Verbreitung, Verwendung und/oder Handeln aufgrund des Inhalts
dieser Informationen zu unterlassen ist. Sollten Sie diese Nachricht
versehentlich erhalten haben, ersuchen wir Sie, uns über diesen Umstand zu
unterrichten. Bitte löschen Sie dann anschließend diese E-Mail endgültig von
Ihrem System.
All information contained in this e-mail message including attachments is
privileged and confidential. The information contained herein is intended
solely for the use and knowledge of the individual(s) to whom this
communication is addressed and/or others authorised to receive it. If you are
not the intended recipient, you are hereby notified that any disclosure,
copying, distribution, use and/or taking action in reliance on the contents of
this information is strictly prohibited. If you accidentally received this
e-mail, kindly let us know about this. On having done so, please delete this
e-mail permanently from your system.
List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address
--
You received this message because you are subscribed to the Google Groups
"il-antlr-interest" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/il-antlr-interest?hl=en.