[antlr-interest] Expression Parser - identifying invalid expressions
kumarsriram
sriram.kumar at nomissolutions.com
Mon Aug 16 17:19:52 PDT 2004
Hi,
I'm writing a glorified formula parser and borrowed some of the
concepts from java.g bundled with the examples in antlr. I'm pretty
new to the world of parsers, so pardon my ignorance.
I have the following sub-rules for conditional, relational,
multiplicative, additive expressions that handle simple formulae.
The trouble is, my parser doesn't seem to catch invalid cases. For
example, if there's a conditional expression of the
form "expr1>expr2 & expr3<expr4" it doesn't throw an exception to
indicate that "&" is invalid (it must be "&&"). It just takes the
first predicate "expr1>expr2" and matches it against a "relExpr"
rule and proceeds further.
So I wrote an explicit look ahead as follows:
// logical or (||)
condExpr
:(logicalAndExpression VAR )=>logicalAndExpression (LOR^
expr2:logicalAndExpression)+
| logicalAndExpression
;
}
// logical and (&&)
logicalAndExpression
:(equalityExpr VAR)=>(expr1:equalityExpr) (LAND^
equalityExpr)+
| equalityExpr
;
}
Is there any other simpler way of specifying the same? Otherwise, I
need to perform an explicit lookahead in every rule.
Regards,
Sriram
The complete grammar is:
class MyParser extends Parser;
options {
buildAST = true;
k=1;
}
// logical or (||)
condExpr
:(logicalAndExpression VAR )=>logicalAndExpression (LOR^
expr2:logicalAndExpression)+
| logicalAndExpression
;
exception
catch [RecognitionException ex] {
throw ex;
}
// logical and (&&)
logicalAndExpression
:(equalityExpr VAR)=>(expr1:equalityExpr) (LAND^
equalityExpr)+
| equalityExpr
;
}
// logical and (&&)
equalityExpr
:(relExpr (NOT_EQUAL^ | JAVA_EQUAL^))=> relExpr ((NOT_EQUAL^
| JAVA_EQUAL^) relExpr)*
| relExpr
;
}
// boolean relational expressions
relExpr
: addExpr (GT^|GT_EQ^|LT^|LT_EQ^addExpr))*
;
// binary addition/subtraction
addExpr
: multExpr ((PLUS^ | MINUS^) multExpr)*
;
// multiplication/division/modulo
multExpr
: unaryExpr ((STAR^ | DIV^ | MOD^ ) unaryExpr)*
;
unaryExpr
: MINUS^ unaryExpr
| PLUS^ unaryExpr
| unaryExprNotPlusMinus
;
unaryExprNotPlusMinus
: LNOT^ unaryExpr
| postfixExpr
;
postfixExpr:
(id:VAR LPAREN)=>
// Matches function call syntax like "pow(a,b)"
id2:VAR^
(
parenArgs
)?
|atom;
parenArgs:
LPAREN^ (addExpr(COMMA addExpr)*)? RPAREN^;
atom:
VAR
| NUM
| CHAR_LITERAL
| STRING_LITERAL
| INPUT_VAR
| LPAREN! condExpr RPAREN!;
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/antlr-interest/
<*> To unsubscribe from this group, send an email to:
antlr-interest-unsubscribe at yahoogroups.com
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
More information about the antlr-interest
mailing list