[antlr-interest] Problem with Backtrack

Terence Parr parrt at cs.usfca.edu
Fri Dec 22 11:00:54 PST 2006


Hi, must be related to actions, which are not executed during  
backtracking...init actions are executed though...
Ter
On Dec 20, 2006, at 7:03 PM, Alexander Gängel wrote:

> My Grammar uses the backtrack option.
>
> but now I have a Problem, after I check a predicate it wont match  
> my Input.
>
> if I remove the Backtrack Option It works. (can't I use Backtrack  
> and Predicates tried it before an I worked I think)
>
> I use AntlrWorks 1.0b8
>
> could somebody tell me, if there is something wrong with my grammar?
>
> Alexander Gängel
>
>
> the start rule is: oclExpression
>
> the not working Input: validFrom.mod
>
> hier is the Grammar:
>
> grammar ocl;
>
> options  {
>     backtrack=true;
>     k=2;
>     output=AST;
>     ASTLabelType=CommonTree;
>     }
>
> tokens {
>     Var;
>     Type;
>     TupleType;
>     Collection;
>     IfExpression;
>     VariableExp;
>     CollectionRange;
> }
>
> @members {
>     boolean op = false;
> }
>
> typeCS    :
>     collectionTypeCS -> ^(Type collectionTypeCS)
>     | Identifier -> ^(Type Identifier)
>     |tupleTypes -> ^(Type  tupleTypes)
>     ;
>
>
> collectionTypeCS
>     :
>     collectionTypeIdentifier '(' typeCS ')' -> ^(Collection  
> collectionTypeIdentifier typeCS)
>     ;
>
> tupleTypes
>     :
>     'TupleType' '(' variableDeclaration ')' -> ^(TupleType  
> variableDeclaration)
>     ;
>
> oclExpression
>     :
>     (
>      oclExpression_direct
>     (
>         ( ocl_or_operation)* (standard_operation  oclExpression  )*)
>     )
>     |'('oclExpression')'
>     ;
>
> ocl_or_operation
>     :
>     ('.'{op=true;}(oclExpression|ocl_operations))
>     ;
>
> ocl_operations
>     :
>     {op}?
>     ('mod'^|'div'^){op=false;}
>     ;
>
> oclExpression_direct
>     :
>     (    (literalExp-> literalExp)
>         |
>         (variableExp-> variableExp)
>         |
>         (ifExpression-> ifExpression)
>     )
>     ;
>
> standard_operation
>     :
>     OP_Plus
>     ;
>
>
> literalExp
>     :
>     collectionLiteralExp
>     |tupleLiteralExp
>     ;
>
> tupleLiteralExp
>     :
>     integerLiteral
>     |RealLiteral
>     |StringLiteral
>     |booleanLiteral
>     ;
>
> collectionLiteralExp
>     :
>     collectionTypeIdentifier '{'collectionLiteralParts '}' -> ^ 
> (collectionTypeIdentifier collectionLiteralParts)
>     ;
>
> collectionLiteralParts
>     :
>     collectionLiteralPart (',' collectionLiteralPart)*   -> ^ 
> (collectionLiteralPart)+
>     ;
>
> collectionLiteralPart
>     :
>     oclExpression -> ^(oclExpression)
>     |collectionRange -> ^(collectionRange)
>     ;
>
> collectionRange
>     :
>     oclExpression '..' oclExpression -> ^(CollectionRange  
> oclExpression+)
>     ;
>
>
> variableExp
>     :
>     Identifier ('('oclExpression?')')? -> ^(Identifier oclExpression?)
>     ;
>
>
> ifExpression
>     :
>     ifpart
>     thenpart
>     elsepart
>     'endif'
>     ;
>
>
> ifpart    :
>     'if' oclExpression -> ^('if' ^(oclExpression))
>     ;
>
> thenpart    :
>     'then' oclExpression -> ^('then' ^(oclExpression))
>     ;
>
>
> elsepart    :
>     'else' oclExpression -> ^('else' ^(oclExpression))
>     ;
>
> variableDeclaration
>     :
>     Identifier (Colon typeCS)? ( '=' oclExpression)?
>     ->  ^(Var Identifier typeCS? oclExpression?)
>     ;
>
> collectionTypeIdentifier
>     :
>     'Set'
>     |'Bag'
>     |'Sequence'
>     |'OrderedSet'
>     |'Collection'
>     ;
>
> // LEXER
> Identifier
>     :   ('a'..'z'|'A'..'Z'|'_') (Letter)*
>         ;
>
> fragment
> Letter
>         :'a'..'z'|'A'..'Z'|'0'..'9'|'_'|'$';
>
>
> WS    :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=99;}
>     ;
>
> COMMENT
>     :   '/*' ( options {greedy=false;} : . )* '*/' {$channel=99;}
>     ;
>
> LINE_COMMENT
>        : ('//'|'--') ~('\n'|'\r')* '\r'? '\n' {$channel=99;}
>     ;
>
> Colon   :
>     ':'
>     ;
>
> StringLiteral    :
>      '\''  ~('\'')* '\''   {setText(getText().substring(1, getText 
> ().length()-1));}
>      ;
>
> booleanLiteral    :
>     'true'| 'false'
>     ;
>
> RealLiteral
>     :
>         //'.' ('0'..'9')+ Exponent? FloatTypeSuffix?
>       ('0'..'9')+
>         (
>             (Exponent FloatTypeSuffix?)|(FloatTypeSuffix)
>                 |('.' ('0'..'9')+) Exponent? FloatTypeSuffix?
>         );
>
> fragment
> Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
>
> fragment
> FloatTypeSuffix : ('f'|'F'|'d'|'D') ;
>
> integerLiteral
>     :   HexLiteral
>     |   OctalLiteral
>     |   DecimalLiteral
>     ;
>
> HexLiteral : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;
>
> DecimalLiteral : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;
>
> OctalLiteral :  '0' ('0'..'7')+ IntegerTypeSuffix? ;
>
> fragment
> HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
>
> fragment
> IntegerTypeSuffix : ('l'|'L') ;
>
> OP_Plus    :    '+';
>



More information about the antlr-interest mailing list