[antlr-interest] conditional processing

Mark Volkmann r.mark.volkmann at gmail.com
Wed Nov 28 12:45:49 PST 2007


On 11/28/07, Mark Volkmann <r.mark.volkmann at gmail.com> wrote:
> On 11/28/07, Gerald B. Rosenberg <gbr at newtechlaw.com> wrote:
> >
> >  Probably a bit of overkill in your given case, but to do it (using the
> > boolean return from condition):
> >
> >  statement
> >    : simpleStatement
> >    | ^('IF' b=condition { $b.result }? simpleStatement)
> >    ;
> >    catch[FailedPredicateException fpe] {System.err.println("Ignore");}
> >
> >  simpleStatement
> >          : ^('ADD' n=NUMBER) { value += toInt(n); }
> >          | ^( 'SUBTRACT' n=NUMBER) { value -= toInt(n); }
> >          | 'PRINT' { System.out.println(value); }
> >          ;
> >
> >  Appropriate where simpleStatement does not/should not be aware of
> > condition.
>
> I like your approach, but I can't get it to work. It seems that
> something is wrong with the catch of FailedPredicateException. When
> the first IF whose condition evaluates to false is encountered, it
> prints "Ignore", executes the simpleStatement after the semantic
> predicate anyway, and then stops processing, ignoring the rest of the
> AST.

Do I need to do something in the catch to consume the tokens that make
up the simpleStatement that I'm skipping because the condition
evaluated to false? I see something like that in section 10.5 of the
book. I don't have a terminating token for my simpleStatements though.
I need to consume the next AST node and it's descendants.

> >  At 07:29 AM 11/28/2007, Mark Volkmann wrote:
> >
> > On 11/26/07, Gerald B. Rosenberg <gbr at newtechlaw.com> wrote:
> >  >
> >  >  At 07:02 PM 11/26/2007, Mark Volkmann wrote:
> >  >
> >  > Part of my AST looks like this.
> >  >
> >  >  ^('if' condition simpleStatement)
> >  >  Would help to see the full rule and the condition rule.  Still, a
> > possible
> >  > solution is to use a semantic predicate, something like:
> >  >
> >  >  ^('if' b=condition { $b.equals("true") }? simpleStatement)
> >
> >  I want to try you suggestion. Below is my grammar with your suggestion
> >  incorporated. When the generated Java code is compiled, I get the
> >  following error. Do you see anything wrong in my small grammar?
> >
> >  ---
> >
> >      [javac]
> > /Users/Mark/Documents/Programming/ANTLR/MathScriptAST/gen/com/ociweb/mathscript/MathScriptTree.java:179:
> >  cannot find symbol
> >      [javac] symbol  : variable $b
> >      [javac] location: class
> > com.ociweb.mathscript.MathScriptTree
> >      [javac]                     if ( !( $b.equals("true") ) ) {
> >      [javac]                             ^
> >
> >  ---
> >
> >  tree grammar MathScriptTree;
> >
> >  options {
> >           ASTLabelType = CommonTree;
> >          tokenVocab = MathScript;
> >          output = template;
> >  }
> >
> >  @header {
> >    package com.ociweb.mathscript;
> >  }
> >
> >  @members {
> >    int value;
> >
> >    private static int toInt(CommonTree node) {
> >      return Integer.parseInt(node.getText());
> >    }
> >  }
> >
> >  script: ^(SCRIPT statement*);
> >
> >  statement
> >    :     simpleStatement
> >    | ^('IF' b=condition { $b.equals("true") }? simpleStatement)
> >    ;
> >
> >  simpleStatement
> >          : ^('ADD' n=NUMBER) { value += toInt(n); }
> >          | ^('SUBTRACT' n=NUMBER) { value -= toInt(n); }
> >          | 'PRINT' { System.out.println(value); }
> >          ;
> >
> >  condition returns [boolean result]
> >    :     'POSITIVE' { $result = value > 0; }
> >    | 'NEGATIVE' { $result = value < 0; }
> >    | ^('<' n=NUMBER) { $result = value < toInt(n); }
> >    | ^('>' n=NUMBER) { $result = value > toInt(n); }
> >    | ^('=' n=NUMBER) { $result = value == toInt(n); }
> >    ;
> >
> >  >
> >  >
> >  >
> >  >
> >  > In my tree grammar, the rule for "condition" evaluates the matching
> >  >  content to true or false. The rule for "simpleStatement" executes the
> >  >  statement, for example, it could be a simple print statement. I only
> >  >  want simpleStatement to be executed if condition evaluates to true. I
> >  >  haven't been able to figure out how to make this work because when
> >  >  this part of my AST is matched, the rules for both condition and
> >  >  simpleStatement are fired.
> >  >
> >  >  I'd appreciate any hints on how to achieve this.
> >  >
> >  >  --
> >  >  R. Mark Volkmann
> >  >  Object Computing, Inc.
> >  >
> >  >  ----
> >  >  Gerald B. Rosenberg, Esq.
> >  >  NewTechLaw
> >  >  260 Sheridan Ave., Suite 208
> >  >  Palo Alto, CA  94306-2009
> >  >
> >  >  650.325.2100  (office)  /  650.703.1724  (cell)
> >  >  650.325.2107  (facsimile)
> >  >
> >  >  www.newtechlaw.com
> >  >
> >  >
> >  >  CONFIDENTIALITY NOTICE:  This email message (including any attachments)
> > is
> >  > being sent by an attorney, is for the sole use of the intended recipient,
> >  > and may contain confidential and privileged information.  Any
> > unauthorized
> >  > review, use, disclosure or distribution is prohibited.  If you are not
> > the
> >  > intended recipient, please contact the sender immediately by reply email
> > and
> >  > delete all copies of this message and any attachments without retaining a
> >  > copy.
> >
> >
> >  --
> >  R. Mark Volkmann
> >  Object Computing, Inc.
> >  ----
> >  Gerald B. Rosenberg
> >  Certiv Analytics
> >
> >  www.certiv.net
> >
>
>
> --
> R. Mark Volkmann
> Object Computing, Inc.
>


-- 
R. Mark Volkmann
Object Computing, Inc.


More information about the antlr-interest mailing list