[antlr-interest] Java Heap Out of Memory exception

J W wsu_techie at yahoo.com
Wed Sep 8 17:38:42 PDT 2010


Hopefully someone can help me figure out my issue.  I have a fairly 
simple grammar.  If I verify my script using CommonTokenStream, I 
receive a Java heap out of memory exception.  However, if I use the 
ANTLR plugin to test with the same value, I do not receive the exception
 and I see the NoViableAlt exception as expected.

Here is the block I'm verifying:

Action Group 3 Needs Attention
   BranchHours
   Contact A Branch
      Call 1, Ack=Contact, NoConnect=Contact
   EndContact
EndAction

There are two errors with the script above.  The first is the Needs Attention text after Action Group 3.  The second is the Branch text after Contact A.  These were values entered during negative testing that caused the out of memory exception.  Yet, if I copy and paste this script into the Eclipse ANTLR interpreter and verify I see the NoViableAltException I'm expecting.

Below is the code used to verify the script:
        CharStream charStream = new ANTLRStringStream(script.getScriptText());
        CallingScriptLexer lexer = new CallingScriptLexer(charStream);
        TokenStream tokenStream = new CommonTokenStream(lexer);
        CallingScriptParser parser = new CallingScriptParser(tokenStream);
        VerifiedScriptResponse response = new VerifiedScriptResponse(script);
        
        try
        {
            parser.callingScript();
            if (!parser.success) {
                response.setValid(false);
                response.setValidationErrors((ValidationError[])parser.errors.toArray(new ValidationError[0]));                
            } else {
                response.setValid(true);
            }
        }
        catch (RecognitionException regExc)
        {
            response.setValid(false);
            ValidationError[] parseException = new ValidationError[1];
            parseException[0].setDescription(regExc.getMessage());
            parseException[0].setLineNumber(regExc.line);
            parseException[0].setCharacterPosition(regExc.charPositionInLine);
            parseException[0].setExcerpt(regExc.getCause().getMessage());
            response.setValidationErrors(parseException);
        }
        catch (Exception exc)
        {
            response.setValid(false);
            ValidationError[] parseException = new ValidationError[1];            
            parseException[0].setDescription(exc.getMessage());
            response.setValidationErrors(parseException);
        }
        
        return response;
 

And finally the grammar is below.  Any help would be greatly appreciated.

grammar CallingScript;

options {
  language = Java;
}

@header {
    package com.ncr.project24.scriptlanguagebusiness.server.antlr.antlrgenerated;
     import com.ncr.project24.scriptlanguagebusiness.server.antlr.evaluators.*;
     import com.ncr.project24.iincidentdata.dto.server.script.*;     
    
 import java.util.Vector;
}

@lexer::header {
     package com.ncr.project24.scriptlanguagebusiness.server.antlr.antlrgenerated;
     import com.ncr.project24.scriptlanguagebusiness.server.antlr.evaluators.*;
     import com.ncr.project24.iincidentdata.dto.server.script.*;     
     import java.util.Vector;     
}

@members {
    public boolean success = true;
    public Vector<ValidationError> errors = new Vector<ValidationError>();
    
    protected void AddError(RecognitionException exc)
    {
        success = false;
        String[] tokenNames = this.getTokenNames();
        String errorMessage =
 this.getErrorMessage(exc, tokenNames);
        
        ValidationError _valError = new ValidationError(); 
        _valError.setDescription(errorMessage);
        errors.add(_valError);        
    }
    
    protected void Evaluate(Evaluator eval, int line, int pos, String text)
    {
        try
        {
            ValidationError _valError = eval.evaluate();
            String _errDescription = _valError.getDescription();
              if (_errDescription.length() > 0) {
   
               success = false;
                  _valError.setLineNumber(line);
                  _valError.setCharacterPosition(pos);
                  _valError.setExcerpt(text);
                  errors.add(_valError);
              }        
        }
        catch (Exception exc)
        {
            success = false;
            ValidationError _valError =
 new ValidationError();
            _valError.setDescription(exc.getMessage());
            errors.add(_valError);
        }
    }
}    
callingScript
    :    actionGroupBlock+
    ;
    catch [RecognitionException ex] {
        AddError(ex);     
    }

actionGroupBlock
    :    ACTION GROUP INTEGER            
            hoursStatement+ 
            contactBlock+
        ENDACTION
    ;
    catch
 [RecognitionException ex] {
        AddError(ex);     
    }
    
contactBlock
    :    CONTACT NUMIDENT
            callStatement+
        ENDCONTACT
    ;
    catch [RecognitionException ex] {
        AddError(ex); 
    }
    
callStatement
   
 :    CALL i1=INTEGER ((',' ACK '=' CONTACT ',' NOCONNECT '=' 
CONTACT)|(',' ACK '=' t1=(INTEGERPIPETIME | TIME | TIMETICKS) ',' 
NOCONNECT '=' t2=(INTEGERPIPETIME | TIME | TIMETICKS)))?
        {
            Evaluator eval = new TimeTicksEvaluator($t1.text);
   
         Evaluate(eval, $t1.line, $t1.pos, $t1.text);
              eval = new TimeTicksEvaluator($t2.text);
            Evaluate(eval, $t2.line, $t2.pos, $t2.text);
            eval = new CallStatementEvaluator($i1.text);
            Evaluate(eval, $i1.line, $i1.pos, $i1.text); 
        }
    ;
    catch [RecognitionException ex] {
        AddError(ex);     
    }
        
hoursStatement
    :    BRANCHHOURS
    |    AFTERHOURS
    |   
 OTHERHOURS
    |    PEAKHOURS
    |    OFFPEAKHOURS
    |    hoursRange
    |    hoursHoliday        
    ;
    catch [RecognitionException ex] {
        AddError(ex);     
    }
        
hoursRange
    :    HOURSLITERAL dayRange '('t1=TIME '-' t2=TIME ')'
        {
            Evaluator eval = new TimeEvaluator($t1.text);
            Evaluate(eval, $t1.line, $t1.pos, $t1.text);
            eval = new TimeEvaluator($t2.text);
   
         Evaluate(eval, $t2.line, $t2.pos, $t2.text);
            eval = new TimeRangeEvaluator($t1.text, $t2.text);
            Evaluate(eval, $t1.line, $t1.pos, $t1.text + '-' + $t2.text);
        }        
    ;
    catch [RecognitionException ex] {
        AddError(ex);     
    }
    
hoursHoliday
    :    HOURSLITERAL INTEGER
    ;
    catch [RecognitionException ex] {
        AddError(ex);     
    }
    
numericRange
    :    i1=INTEGER ((',' |
 '-') i2=INTEGER)*
        {
            Evaluator eval = new ActionCodeEvaluator($i1.text);
            Evaluate(eval, $i1.line, $i1.pos, $i1.text);
            
            eval = new ActionCodeEvaluator($i2.text);
            Evaluate(eval, $i2.line, $i2.pos, $i2.text);
        }
    ;
    catch [RecognitionException ex] {
        AddError(ex);     
    }
        
dayRange
    :    DAYIDENT ((',' | '-') DAYIDENT)*
    ;
    catch
 [RecognitionException ex] {
        AddError(ex);     
    }
    
relation
    : ('=' | '!=' | '<' | '<=' | '>=' | '>')
    ;
    catch [RecognitionException ex] {
        AddError(ex);     
    }
    
AND: ('a' | 'A')('n' | 'N')('d' | 'D');
OR: ('o' | 'O')('r' | 'R');
MATHEMATICAL: (AND | OR | '*' | '/' | '+' | '-');
ACTION: ('a' | 'A')('c' | 'C')('t' | 'T')('i' | 'I')('o' | 'O')('n' | 'N');
GROUP: ('g' | 'G')('r' | 'R')('o' | 'O')('u' | 'U')('p' | 'P');
END: ('e' | 'E')('n' | 'N')('d' | 'D');
ENDACTION: END ACTION;
BRANCH: ('b' | 'B')('r' | 'R')('a' | 'A')('n' | 'N')('c' | 'C')('h' | 'H');
AFTER: ('a' | 'A')('f' | 'F')('t' | 'T')('e' | 'E')('r' | 'R');
OTHER: ('o' | 'O')('t' |
 'T')('h' | 'H')('e' | 'E')('r' | 'R');
PEAK: ('p' | 'P')('e' | 'E')('a' | 'A')('k' | 'K');
OFFPEAK: ('o' | 'O')('f' | 'F')('f' | 'F')PEAK;
HOURSLITERAL: ('h' | 'H')('o' | 'O')('u' | 'U')('r' | 'R')('s' | 'S');
CONTACT: ('c' | 'C')('o' | 'O')('n' | 'N')('t' | 'T')('a' | 'A')('c' | 'C')('t' | 'T');
CALL: ('c' | 'C')('a' | 'A')('l' | 'L')('l' | 'L');
ACK: ('a' | 'A')('c' | 'C')('k' | 'K');
NOCONNECT: ('n' | 'N')('o' | 'O')('c' | 'C')('o' | 'O')('n' | 'N')('n' | 'N')('e' | 'E')('c' | 'C')('t' | 'T');
USE: ('u' | 'U')('s' | 'S')('e' | 'E');
SERVICE: ('s' | 'S')('e' | 'E')('r' | 'R')('v' | 'V')('i' | 'I')('c' | 'C')('e' | 'E');
TIMER: ('t' | 'T')('i' | 'I')('m' | 'M')('e' | 'E')('r' | 'R');
REPEAT: ('r' | 'R')('e' | 'E')('p' | 'P')('e' | 'E')('a' | 'A')('t' | 'T');
WHEN: ('w' | 'W')('h' | 'H')('e' | 'E')('n' | 'N');
ACKED: ('a' | 'A')('c' | 'C')('k' | 'K')('e' | 'E')('d' | 'D');
ARRIVAL: ('a' | 'A')('r' | 'R')('r' |
 'R')('i' | 'I')('v' | 'V')('a' | 'A')('l' | 'L');
ARRIVED: ('a' | 'A')('r' | 'R')('r' | 'R')('i' | 'I')('v' | 'V')('e' | 'E')('d' | 'D');
YES: ('y' | 'Y')('e' | 'E')('s' | 'S');
NO: ('n' | 'N')('o' | 'O');
TRUE: ('t' | 'T')('r' | 'R')('u' | 'U')('e' | 'E');
FALSE: ('f' | 'F')('a' | 'A')('l' | 'L')('s' | 'S')('e' | 'E');
ELAPSED: ('e' | 'E')('l' | 'L')('a' | 'A')('p' | 'P')('s' | 'S')('e' | 'E')('d' | 'D');
CLEAR: ('c' | 'C')('l' | 'L')('e' | 'E')('a' | 'A')('r' | 'R');
CLOSED: ('c' | 'C')('l' | 'L')('o' | 'O')('s' | 'S')('e' | 'E')('d' | 'D');
TICKET: ('t' | 'T')('i' | 'I')('c' | 'C')('k' | 'K')('e' | 'E')('t' | 'T');
CANCEL: ('c' | 'C')('a' | 'A')('n' | 'N')('c' | 'C')('e' | 'E')('l' | 'L');
CHANGE: ('c' | 'C')('h' | 'H')('a' | 'A')('n' | 'N')('g' | 'G')('e' | 'E');
GENERATE: ('g' | 'G')('e' | 'E')('n' | 'N')('e' | 'E')('r' | 'R')('a' | 'A')('t' | 'T')('e' | 'E');
STATUS: ('s' | 'S')('t' | 'T')('a' | 'A')('t' |
 'T')('u' | 'U')('s' | 'S');
CHECK: ('c' | 'C')('h' | 'H')('e' | 'E')('c' | 'C')('k' | 'K');
RESULT: ('r' | 'R')('e' | 'E')('s' | 'S')('u' | 'U')('l' | 'L')('t' | 'T');
IF: ('i' | 'I')('f' | 'F');
ELSE: ('e' | 'E')('l' | 'L')('s' | 'S')('e' | 'E');
DEFERUNTIL: ('d' | 'D')('e' | 'E')('f' | 'F')('e' | 'E')('r' | 'R')('u' | 'U')('n' | 'N')('t' | 'T')('i' | 'I')('l' | 'L');
CONCURRENT: ('c' | 'C')('o' | 'O')('n' | 'N')('c' | 'C')('u' | 'U')('r' | 'R')('r' | 'R')('e' | 'E')('n' | 'N')('t' | 'T');
DISPATCHACTION: ('d' | 'D')('i' | 'I')('s' | 'S')('p' | 'P')('a' | 'A')('t' | 'T')('c' | 'C')('h' | 'H') ACTION;
SITEDISPATCHACTION: ('s' | 'S')('i' | 'I')('t' | 'T')('e' | 'E') '.' DISPATCHACTION;
IN: ('i' | 'I')('n' | 'N');
DONE: ('d' | 'D')('o' | 'O')('n' | 'N')('e' | 'E');
ID: ('i' | 'I')('d' | 'D');
HOLD: ('h' | 'H')('o' | 'O')('l' | 'L')('d' | 'D');
INITIATE: ('i' | 'I')('n' | 'N')('i' | 'I')('t' | 'T')('i' | 'I')('a' |
 'A')('t' | 'T')('e' | 'E');
INFO: ('i' | 'I')('n' | 'N')('f' | 'F')('o' | 'O');
SCRIPT: ('s' | 'S')('c' | 'C')('r' | 'R')('i' | 'I')('p' | 'P')('t' | 'T');
COLOR: ('c' | 'C')('o' | 'O')('l' | 'L')('o' | 'O')('r' | 'R');
WAIT: ('w' | 'W')('a' | 'A')('i' | 'I')('t' | 'T');
REEVALUATE: ('r' | 'R')('e' | 'E')('e' | 'E')('v' | 'V')('a' | 'A')('l' | 'L')('u' | 'U')('a' | 'A')('t' | 'T')('e' | 'E');
DO: ('d' | 'D')('o' | 'O');
COMMAND: ('c' | 'C')('o' | 'O')('m' | 'M')('m' | 'M')('a' | 'A')('n' | 'N')('d' | 'D');
OBJECT: ('o' | 'O')('b' | 'B')('j' | 'J')('e' | 'E')('c' | 'C')('t' | 'T');
COUNTER: ('c' | 'C')('o' | 'O')('u' | 'U')('n' | 'N')('t' | 'T')('e' | 'E')('r' | 'R');
INCREMENT: ('i' | 'I')('n' | 'N')('c' | 'C')('r' | 'R')('e' | 'E')('m' | 'M')('e' | 'E')('n' | 'N')('t' | 'T');
STATE: ('s' | 'S')('t' | 'T')('a' | 'A')('t' | 'T')('e' | 'E');
ACTIVATE: ('a' | 'A')('c' | 'C')('t' | 'T')('i' | 'I')('v' | 'V')('a' |
 'A')('t' | 'T')('e' | 'E');
THRESHOLD: ('t' | 'T')('h' | 'H')('r' | 'R')('e' | 'E')('s' | 'S')('h' | 'H')('o' | 'O')('l' | 'L')('d' | 'D');
DEACTIVATE: ('d' | 'D')('e' | 'E') ACTIVATE;
DECREMENT: ('d' | 'D')('e' | 'E')('c' | 'C')('r' | 'R')('e' | 'E')('m' | 'M')('e' | 'E')('n' | 'N')('t' | 'T');
WITHIN: ('w' | 'W')('i' | 'I')('t' | 'T')('h' | 'H')('i' | 'I')('n' | 'N');

ACTIONGROUP: ACTION GROUP;
ENDIF: END IF;
CHANGESTATUS: CHANGE STATUS;
CANCELSERVICE: CANCEL SERVICE;
INITIATESERVICE: INITIATE SERVICE;
CHECKSTATUS: CHECK STATUS;
CHECKSTATUSRESULT: CHECKSTATUS '.' RESULT;
COMMANDRESULT: COMMAND '.' RESULT;
OBJECTCOUNTER: OBJECT '.' COUNTER;
OBJECTSTATE: OBJECT '.' STATE;
OBJECTTHRESHOLD: OBJECT '.' THRESHOLD;
GENERATESTATUS: GENERATE STATUS;
ENDWHEN: END WHEN;
ENDTIMER: END TIMER;
ENDSERVICE: END SERVICE;
ENDCONTACT: END CONTACT;
BRANCHHOURS: BRANCH HOURSLITERAL;
AFTERHOURS: AFTER
 HOURSLITERAL;
OTHERHOURS: OTHER HOURSLITERAL;
PEAKHOURS: PEAK HOURSLITERAL;
OFFPEAKHOURS: OFFPEAK HOURSLITERAL;
TICKETCOLOR: TICKET '.' COLOR;
TIME: INTEGER ':' INTEGER;
INTEGERPIPETIME: (INTEGER '|')? TIME; 
TIMETICKS: (INTEGER '|')? TIME ('/' INTEGER)?;
ANDOR: (AND | OR)?;

INTEGER : '0'..'9'+ ;
DAYIDENT: 'n' | 'N' | 'm' | 'M' | 't' | 'T' | 'w' | 'W' | 'r' | 'R' | 'f' | 'F' | 's' | 'S';
NUMIDENT: (('0'..'9') | ('A'..'Z') | ('a'..'z') | '*' | '#')+;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;};
COMMENT : '\'' .* ('\n' | '\r') {$channel = HIDDEN;};


      


More information about the antlr-interest mailing list