antlr不识别数字



我有3种定义的数字,数字,十进制和百分比。

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

百分比和十进制工作正常,但是当我分配一个数字时,除非我在数字前面放一个符号( 或 - ),否则它不会识别为一个数字。
number foo = +5 // does recognize
number foo = 5; // does not recognize

它确实在评估表达中识别它。
if (foo == 5 ) // does recognize

这是我的语言(我删除了功能,只留下语言识别)。

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
    :   ~["\rn]
    |   SimpleEscapeSequence
    |   '\n'   // Added line
    |   '\rn' // Added line
    ;

fragment    
CChar
    :   ~['\rn]
    |   SimpleEscapeSequence
    ;
fragment
SimpleEscapeSequence
    :   '\' ['"?abfnrtv\]
    ;
ExtendedAscii
    : [x80-xfe]+
    -> skip
    ;
Whitespace
    :   [ t]+
        -> skip
    ;
Newline
    :   (   'r' 'n'?
        |   'n'
        )
        -> skip
    ;
BlockComment
    :   '/*' .*? '*/'
        -> skip
    ;

LineComment
    :   '//' ~[rn]*
        -> skip
    ;

我的预感是,这种片段的使用不正确:

fragment Sign :   Plus | Minus;

我在参考书中找不到任何东西,但我认为它需要更改为这样的东西:

fragment Sign :   [+-];

我发现了这个问题。我使用4.5.2-1版,因为每次升级到4.7的尝试都会引起更多错误,因此我不想在尝试解决另一个错误时会造成更多错误。我终于崩溃了,将库升至4.7,修复了错误,数字识别问题消失了。这一直是库中的一个错误。

相关内容

  • 没有找到相关文章

最新更新