[antlr-interest] Seeking advice - 2 questions using ANTLR
Mark Volkmann
r.mark.volkmann at gmail.com
Thu Jan 17 13:55:49 PST 2008
Here's a start on your grammar.
grammar Accounting;
options {
output = template;
}
@lexer::header { package com.ociweb.accounting; }
@parser::header { package com.ociweb.accounting; }
start: ifStatement EOF;
ifStatement
: 'IF' condition 'THEN' statement ('ELSE' statement)? 'END IF';
comparison: expression RELATIONAL_OPERATOR expression;
condition: comparison (LOGICAL_OPERATOR comparison)*;
expression
: STRING_LITERAL
| value (SIGN value)*;
statement: expression | ifStatement;
value: NAME | NUMBER;
LOGICAL_OPERATOR: 'AND' | 'OR';
RELATIONAL_OPERATOR: '<' | '<=' | '=' | '>=' | '>';
APOSTROPHE: '\'';
NUMBER: INTEGER | FLOAT;
fragment FLOAT: INTEGER '.' NATURAL_NUMBER;
fragment INTEGER: SIGN? NATURAL_NUMBER;
fragment NATURAL_NUMBER: '0' | '1'..'9' '0'..'9'*;
SIGN: '+' | '-';
NAME: LETTER (LETTER | NUMBER | '_')*;
STRING_LITERAL: APOSTROPHE NONCONTROL_CHAR* APOSTROPHE;
WHITESPACE: (NEWLINE | SPACE)+ { $channel = HIDDEN; };
// Note that NONCONTROL_CHAR does not include the double-quote character.
fragment NONCONTROL_CHAR: LETTER | DIGIT | SYMBOL | SPACE;
fragment LETTER: LOWER | UPPER;
fragment LOWER: 'a'..'z';
fragment UPPER: 'A'..'Z';
fragment DIGIT: '0'..'9';
fragment NEWLINE: '\r'? '\n';
fragment SPACE: ' ' | '\t';
// Note that SYMBOL does not include the
// apostrophe or double-quote characters.
fragment SYMBOL: '!' | '#'..'&' | '('..'/' | ':'..'@' | '['..'`' | '{'..'~';
It parses your example input except for I changed "H-CAPRESTATE" to
"H_CAPRESTATE" to simply things. This way I can use "-" for
subtraction. I'm sure there's a way to work this out so you can also
use "-" in names.
The grammar above doesn't output anything. It just verifies that input conforms.
Email me privately if you want the Java code I wrote that uses the
generated classes and my Ant build file.
On Jan 17, 2008 3:02 PM, Mark Volkmann <r.mark.volkmann at gmail.com> wrote:
> On Jan 17, 2008 2:04 PM, Frank Font <mrfont at room4me.com> wrote:
> > Hello,
> >
> > I purchased the book, read through it, but I have a thick skull.
> > Perhaps I can get some advice here on two questions about converting
> > formula expressions that look like "basic" syntax...
> >
> > IF REP_DTE > '2001-01-01' AND ATOTAL>100 THEN
> > H-CAPRESTATE
> > ELSE
> > IF REP_DTE < '2001-01-01' THEN
> > ACCTG_CNG + ACCTG_ERR_CRCT
> > END IF
> > END IF
> >
> > Into a flat format that looks like Excel formula syntax...
> >
> > IF( AND(REP_DTE > '2001-01-01',ATOTAL>100), H-CAPRESTATE, IF(REP_DTE <
> > '2001-01-01', ACCTG_CNG + ACCTG_ERR_CRCT)
> >
> > I tried writing a few grammar files, but all have had various runtime
> > issues.
> >
> > Here are my questions...
> >
> > 1. Is ANTLR the right tool for this job? (I don't have much time.)
>
> ANTLR can definitely do this. However, you shouldn't expect the work
> to go quickly if this is your first ANTLR grammar. You'll be learning
> lots of things along the way.
>
> > 2. If it is the right tool, is there already a grammar that will get me
> > most of the way there?
>
> I'm not aware of a particular existing grammar that is close to what
> you want. Maybe someone else knows of one.
>
>
> > Thanks in advance for any advice.
> >
> > Regards,
> > Frank Font
>
> --
> R. Mark Volkmann
> Object Computing, Inc.
>
--
R. Mark Volkmann
Object Computing, Inc.
More information about the antlr-interest
mailing list