[antlr-interest] Problem with Separators

Craig Main craig at palantir.co.za
Sun Dec 25 21:50:27 PST 2005


Hi,

 

I am using a grammar and a tree to recognise a simple expression grammar.

At the moment, the rules for using semi colons ';' are very strict, and I
need to relax them somewhat.

 

The grammar parses the following spectacularly well.

if (10 < 4 and 4 < 1) {

     c = 10

} else

   m = 20;

a = 10;

b = 40

 

I would like to be able to (optionally) terminate the last statement (b =
40) with a semi-colon, and also optionally terminate the c = 10 with a semi
colon so that the following is also valid.

 

if (10 < 4 and 4 < 1) {

     c = 10;

} else

   m = 20;

a = 10;

b = 40;

 

Could someone help with this please? I am really struggling with k=1, I am
happy to increase k, but my attempts have failed so far. I am sure I am
missing something simple.

I have placed the grammar below. I am aware that I need to somehow use the
semi as a statement terminator rather than a statement separator. I have
attempted to do this but I am really struggling to keep it all working with
that approach. If you have the time please give me some specifics, I would
appreciate it.

 

// THE GRAMMAR.G FILE, THE TREE FOLLOWS

 

rules                     {log.Debug(null);}

                        : (statement (SEMI! statement)*)?

                          {#rules = #([RULESET, "RULESET"], #rules);}

                          EOF!

                        ;

 

statementSequence       : statementBlock

                        | statement

                        | SEMI!

                        ;

 

statementBlock            {log.Debug(null);}

                        : LCURL! (statement (SEMI! statement)*)? RCURL!

                        ;

 

statement                 {log.Debug(null);}

                        : assignmentStatement

                        | constantStatement

                        | ifStatement

                        ;

 

ifStatement               {log.Debug(null);}

                        : TOK_IF^ LPAREN! conditional RPAREN!
statementSequence

                          (

                             options {

                                 warnWhenFollowAmbig = false;

                             }

                          : TOK_ELSE statementSequence

                          )?

                        ;

 

conditional               {log.Debug(null);}

                        : logicalOr

                        ;

 

logicalOr               : logicalAnd (TOK_OR^ logicalAnd)*

                        ;

 

logicalAnd              : equalityExpression (TOK_AND^ equalityExpression)*

                        ;

 

equalityExpression      : relational ((NOT_EQUAL^ | EQUAL^) relational)*

                        ;

 

relational                {log.Debug(null);}

                        : expression

                          ((LTHAN^

                          | GTHAN^

                          | LTE^

                          | GTE^)

                          expression)*

                        ;

 

constantStatement : TOK_CONST^ id:ID ASSIGN factor

                        ;

 

assignmentStatement : id:ID ASSIGN^ expression

                        ;

 

expression : term ((PLUS^|MINUS^) term)*

                        ;

 

term : factor ((MULTIPLY^|DIVIDE^) factor)*

                        ;

 

factor : (ID LPAREN) => function

                        | literal

                        ;

 

Function : id:ID^ {#id.setType(METHOD_CALL);} LPAREN! arguments RPAREN!

                        ;

 

Arguments : (expression (COMMA! expression)*)?

                          {#arguments = #(#[ELIST,"ELIST"], #arguments);}

                        ;

 

Literal : id:ID^

                        | fl:FLOAT^

                        | LPAREN^ expression RPAREN

                        ;

// THE TREE GRAMMAR FILE

rules                   : #(RULESET (statement)*)

                        ;

 

statement                        : #(ASSIGN id:ID result=expression {
log.Info(string.Format("{0} = {1}", id.getText(), result)); } ) 

                                 | #(TOK_CONST cid:ID ASSIGN result=term)
{log.Info("constant decl");}

                                 | {log.Debug("inside");}

                                   #(TOK_IF condition (statement)*
({log.Debug("in-else");} TOK_ELSE (statement)* {log.Debug("out-else");})?)

                                   {log.Debug("outside");}

                                 ;

condition                        

returns [object result]

                                 : #(TOK_OR l=condition r=condition)

                                    | #(TOK_AND l=condition r=condition)

                                    | #(NOT_EQUAL l=condition r=condition)

                                    | #(EQUAL l=condition r=condition)

                                    | #(LTHAN l=condition r=condition)

                                    | #(GTHAN l=condition r=condition)

                                    | #(LTE l=condition r=condition)

                                    | #(GTE l=condition r=condition)

                                 | result=expression
{log.Debug("condition->expression");}

                                 ;

expression

returns [object result]         : #(PLUS l=term r=term)
{result=ExpressionOperation.Add(l,r);}

                                 | #(MINUS l=term r=term)
{result=ExpressionOperation.Subtract(l,r);}

                                 | #(MULTIPLY l=term r=term)
{result=ExpressionOperation.Multiply(l,r);}

                                 | #(DIVIDE l=term r=term)
{result=ExpressionOperation.Divide(l,r);}                                 

                                 | result=term {log.Debug("term");}

                                 ;

term

returns [object result]         : result=literal

                                 | #(m:METHOD_CALL #(ELIST (expr=expression
{log.Info(string.Format("e{0}",expr));})*)) {log.Info(string.Format("Method
Call {0}", m.getText()));}

                                 ;

 

literal

returns [object result]          : id:ID { result = id.getText(); }

                                 | fl:FLOAT { result =
double.Parse(fl.getText()); }

                                 | #(LPAREN expression)

                                 ;

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20051226/4269fb3f/attachment-0001.html


More information about the antlr-interest mailing list