I'm trying to write a simple time interval expression parser. I want to be able
to write expressions like this:
-15/2:03:45.3 + +02:43
where
- 15 / 2 : 03 : 45.3
negate days hours minutes seconds
I've appended my grammar below. It was working pretty well until I tried to
introduce the floating-point literals in the seconds position. I tried changing
s=int to s=float. What I really want is for it to be either a float or an int.
But I don't want floats anywhere else.
"s=float" interprets in ANTLRWorks to "<epsilon>", and the grammar check gets
some errors for "TimeInterval.g:11:4: The following alternatives can never be
matched: 2" (the first line of the interval production).
I've spent an half-hour Googling, and while I find some discussion of unary
minus, it's not clear to me what I need to do make it work in my situation. I
also don't know what the epsilon stuff is all about.
Any feedback would be much appreciated. Thanks!
--
Rick
grammar TimeInterval;
intervalExpr returns [float val]
: i=interval { $val = $i.val; }
( '+' i=interval { $val += $i.val; }
| '-' i=interval { $val -= $i.val; }
)*
;
interval returns [float val]
: ( '+'? i=posInterval { $val = $i.val; }
| '-' i=posInterval { $val = -$i.val; }
)
;
posInterval returns [float val]
: (d=int '/')? (h=int ':')? (m=int ':')? s=int { $val = d * 24.0
* 3600.0 + h * 3600.0 + m * 60.0 + s; }
;
int returns [float val]
: INT { $val = Integer.parseInt($INT.text); }
;
float returns [float val]
: { $val = Float.parseFloat($FLOAT.text); }
;
INT : '0'..'9'+
;
FLOAT
: ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
| '.' ('0'..'9')+ EXPONENT?
| ('0'..'9')+ EXPONENT
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
fragment
EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
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.