[antlr-interest] and, finally, ternary operator works
Sam Harwell
sharwell at pixelminegames.com
Fri Feb 25 19:14:37 PST 2011
Ternary for C++ is even stranger, though I'm not sure it's necessary to
support it at this point.
x ? a : b = c
should parse as this in C++:
(? x a (= b c))
But as this is C (which is found to be invalid at a later time since the
ternary operator cannot return an lvalue in C):
(= (? x a b) c)
However, in both C and C++ the following:
x = c ? a : b
Should parse as:
(= x (? c a b))
I've been watching for those check-ins, and I see one now! :)
Sam
-----Original Message-----
From: antlr-interest-bounces at antlr.org
[mailto:antlr-interest-bounces at antlr.org] On Behalf Of Terence Parr
Sent: Friday, February 25, 2011 7:41 PM
To: antlr-interest Interest
Subject: [antlr-interest] and, finally, ternary operator works
Wow. I'm having fun. I guess i'll bring into main line now. The beauty is
that I'm generating another grammar with very little target code needed. I
will add the following to each target:
// used for left-recursive rules
recRuleDefArg() ::= "int <recRuleArg()>"
recRuleArg() ::= "_p"
recRuleAltPredicate(ruleName,opPrec) ::= "<recRuleArg()> \<= <opPrec>"
recRuleSetResultAction() ::= "root_0=$<ruleName>_primary.tree;"
That will be correct for most targets. here's output for the below test:
e_[int _p]
: e_primary {root_0=$e_primary.tree;}
(
( {_p <= 6}?=> '*'^ e_[7]{}
| {_p <= 5}?=> '+'^ e_[6]{}
| {_p <= 3}?=> '='<assoc=right>^ e_[3]{}
| {_p <= 4}?=> '?'<assoc=right>^ e ':'! e_[4]{}
)
)*
;
here's another test.
@Test public void testTernaryExpr() throws Exception {
String grammar =
"grammar T;\n" +
"options {output=AST;}\n" +
"e : e '*'^ e" +
" | e '+'^ e" +
" | e '?'<assoc=right>^ e ':'! e" +
" | e '='<assoc=right>^ e" +
" | ID" +
" ;\n" +
"ID : 'a'..'z'+ ;\n" +
"WS : (' '|'\\n') {skip();} ;\n";
String[] tests = {
"a", "a",
"a+b", "(+ a b)",
"a*b", "(* a b)",
"a?b:c", "(? a b c)",
"a=b=c", "(= a (= b c))",
"a?b+c:d", "(? a (+ b c) d)",
"a?b=c:d", "(? a (= b c) d)",
"a? b?c:d : e", "(? a (? b c d) e)",
"a?b: c?d:e", "(? a b (? c d e))",
};
runTests(grammar, tests, "e");
}
ternary is pretty weird. C and Java grammars show
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
So it's right associative but middle expr acts like (expr).
Ter
List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address
More information about the antlr-interest
mailing list