Antlr not recognizing number

514 Views Asked by At

I have 3 types of numbers defined, number, decimal and percentage.

Percentage : (Sign)? Digit+ (Dot Digit+)? '%' ;
Number : Sign? Digit+;
Decimal : Sign? Digit+ Dot Digit*;

Percentage and decimal work fine but when I assign a number, unless I put a sign (+ or -) in front of the number, it doesn't recognize it as a number.
number foo = +5 // does recognize
number foo = 5; // does not recognize

It does recognize it in an evaluation expression.
if (foo == 5 ) // does recognize

Here is my language (I took out the functions and left only the language recognition).

grammar Fetal;
transaction  : begin statements end;

begin       : 'begin' ;

end         : 'end' ;   


statements  : (statement)+
            ;


statement 
            : declaration ';'
            | command ';'
            | assignment ';'
            | evaluation
            | ';'
            ;

declaration : type var;

var returns : identifier;


type returns 
            : DecimalType
            | NumberType
            | StringType 
            | BooleanType
            | DateType
            | ObjectType
            | DaoType
            ;

assignment  
            : lharg Equals rharg
            | lharg unaryOP rharg
            ;


assignmentOp    : Equals
                ;

unaryOP         : PlusEquals
                | MinusEquals
                | MultiplyEquals
                | DivideEquals
                | ModuloEquals
                | ExponentEquals
                ;

expressionOp    : arithExpressOp
                | bitwiseExpressOp
                ;

arithExpressOp  : Multiply
                | Divide
                | Plus
                | Minus
                | Modulo
                | Exponent
                ;

bitwiseExpressOp  
                : And
                | Or
                | Not
                ;

comparisonOp    : IsEqualTo
                | IsLessThan
                | IsLessThanOrEqualTo
                | IsGreaterThan
                | IsGreaterThanOrEqualTo
                | IsNotEqualTo
                ;

logicExpressOp  : AndExpression
                | OrExpression
                | ExclusiveOrExpression
                ;

rharg returns       
            : rharg expressionOp rharg
            | '(' rharg expressionOp rharg ')'
            | var
            | literal
            | assignmentCommands
            ;

lharg returns : var;

identifier  : Identifier;

evaluation : IfStatement '(' evalExpression ')'  block (Else block)?;


block : OpenBracket statements CloseBracket;


evalExpression 
                : evalExpression logicExpressOp evalExpression
                | '(' evalExpression logicExpressOp evalExpression ')'
                | eval
                | '(' eval ')'
                ;


eval : rharg comparisonOp rharg ;


assignmentCommands 
            : GetBalance '(' stringArg ')'
            | GetVariableType '(' var ')'
            | GetDescription
            | Today
            | GetDays '(' startPeriod=dateArg ',' endPeriod=dateArg ')'
            | DayOfTheWeek '(' dateArg ')'
            | GetCalendarDay '(' dateArg ')'
            | GetMonth '(' dateArg ')'
            | GetYear '(' dateArg ')'
            | Import '(' stringArg ')' /* Import( path ) */
            | Lookup '(' sql=stringArg ',' argumentList ')' /* Lookup( table, SQL) */
            | List '(' sql=stringArg ',' argumentList ')' /* List( table, SQL) */
            | invocation 
            ;



command     : Print '(' rharg ')' 
            | Credit '(' amtArg ',' stringArg ')'
            | Debit '(' amtArg ',' stringArg ')'
            | Ledger '(' debitOrCredit ',' amtArg ',' acc=stringArg ',' desc=stringArg ')'
            | Alias '(' account=stringArg ',' name=stringArg ')'
            | MapFile ':' stringArg
            | invocation
            | Update '(' sql=stringArg ',' argumentList ')'
            ;

invocation 
            : o=objectLiteral '.' m=identifier '('argumentList? ')'
            | o=objectLiteral '.' m=identifier '()'
            ;

argumentList 
            : rharg   (',' rharg )*
            ;

amtArg  : rharg ;

stringArg : rharg ;

numberArg : rharg ;

dateArg : rharg ;

debitOrCredit : charLiteral ;

literal 
            : numericLiteral
            | doubleLiteral
            | booleanLiteral
            | percentLiteral
            | stringLiteral
            | dateLiteral
            ;


fileName : '<' fn=Identifier ('.' ft=Identifier)? '>' ;

charLiteral     : ('D' | 'C');

numericLiteral  : Number ;

doubleLiteral   : Decimal ;

percentLiteral  : Percentage ;

booleanLiteral  : Boolean ;

stringLiteral   : String ;

dateLiteral     : Date ;

objectLiteral   : Identifier ;

daoLiteral      : Identifier ;

//Below are Token definitions

// Data Types
DecimalType     : 'decimal' ;
NumberType      : 'number' ;
StringType      : 'string' ;
BooleanType     : 'boolean' ;
DateType        : 'date' ;
ObjectType      : 'object' ;
DaoType         : 'dao' ;
/******************************************************************
 * Assignmnt operator
 ******************************************************************/
 Equals         : '=' ;

 /*****************************************************************
  * Unary operators
  *****************************************************************/
PlusEquals      : '+=' ;
MinusEquals     : '-=' ;
MultiplyEquals  : '*=' ;
DivideEquals    : '/=' ;
ModuloEquals    : '%=' ;
ExponentEquals  : '^=' ;

/*****************************************************************
 * Binary operators
 *****************************************************************/
 Plus           : '+' ;
 Minus          : '-' ;
 Multiply       : '*' ;
 Divide         : '/' ;
 Modulo         : '%' ;
 Exponent       : '^' ;

 /*************************************************************** 
  * Bitwise operators
  ***************************************************************/
  And           : '&' ;
  Or            : '|' ;
  Not           : '!' ;

 /*************************************************************
  * Compariso operators
  *************************************************************/
  IsEqualTo                 : '==' ;
  IsLessThan                : '<'  ;
  IsLessThanOrEqualTo       : '<=' ;
  IsGreaterThan             : '>'  ;
  IsGreaterThanOrEqualTo    : '>=' ;
  IsNotEqualTo              : '!=' ;

 /*************************************************************
  * Expression operators
  *************************************************************/
  AndExpression         : '&&' ;
  OrExpression          : '||' ;
  ExclusiveOrExpression : '^^' ;

// Reserve words (Assignment Commands)
GetBalance      : 'getBalance';
GetVariableType : 'getVariableType' ;
GetDescription  : 'getDescription' ;
Today           : 'today';
GetDays         : 'getDays' ;
DayOfTheWeek    : 'dayOfTheWeek' ;
GetCalendarDay  : 'getCalendarDay' ;
GetMonth        : 'getMonth' ;
GetYear         : 'getYear' ;
Import          : 'import'  ;
Lookup          : 'lookup'  ;
List            : 'list'    ;


// Reserve words (Commands)
Credit          : 'credit';
Debit           : 'debit';
Ledger          : 'ledger';
Alias           : 'alias' ;
MapFile         : 'mapFile' ;
Update          : 'update'  ;
Print           : 'print';

IfStatement : 'if';
Else        : 'else';
OpenBracket : '{';
CloseBracket : '}';

Percentage  : (Sign)? Digit+ (Dot Digit+)? '%' ;

Boolean     : 'true' | 'false';

Number      : Sign? Digit+;


Decimal     : Sign? Digit+ Dot Digit*;

Date        : Year '-' Month '-' Day;

Identifier
    :   IdentifierNondigit
        (   IdentifierNondigit
        |   Digit
        )*
    ;
String: '"' ( ESC | ~[\\"] )* '"';

/************************************************************
 * Fragment Definitions 
 ************************************************************/

fragment
ESC :   '\\' [abtnfrv"'\\]
    ;

fragment
IdentifierNondigit
    :   Nondigit
    //|   // other implementation-defined characters...
    ;
fragment
Nondigit
    :   [a-zA-Z_]
    ;

fragment
Digit
    :  [0-9]
    ;
fragment
Sign :   Plus | Minus;

fragment
Digits
    : [-+]?[0-9]+
    ;

fragment
Year
    : Digit Digit Digit Digit;

fragment
Month
    : Digit Digit;

fragment
Day
    : Digit Digit;


fragment Dot : '.';


fragment
SCharSequence
    :   SChar+
    ;

fragment
SChar
    :   ~["\\\r\n]
    |   SimpleEscapeSequence
    |   '\\\n'   // Added line
    |   '\\\r\n' // Added line
    ;


fragment    
CChar
    :   ~['\\\r\n]
    |   SimpleEscapeSequence
    ;

fragment
SimpleEscapeSequence
    :   '\\' ['"?abfnrtv\\]
    ;

ExtendedAscii
    : [\x80-\xfe]+
    -> skip
    ;
Whitespace
    :   [ \t]+
        -> skip
    ;

Newline
    :   (   '\r' '\n'?
        |   '\n'
        )
        -> skip
    ;

BlockComment
    :   '/*' .*? '*/'
        -> skip
    ;



LineComment
    :   '//' ~[\r\n]*
        -> skip
    ;
2

There are 2 best solutions below

0
On

I have a hunch that this use of a fragment is incorrect:

fragment Sign :   Plus | Minus;

I couldn't find anything in the reference book, but I think it needs to be changed to something like this:

fragment Sign :   [+-];
0
On

I found the issue. I was using version 4.5.2-1 because every attempt to upgrade to 4.7 caused more errors and I didn't want to cause more errors while trying to solve another. I finally broke down and upgraded the libraries to 4.7, fixed the errors and the number recognition issue disappeared. It was a bug in the library, all this time.