2017-09-16 142 views
0

我有3種類型的數字,數字,小數和百分比。Antlr沒有識別號碼

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 
    : ~["\\\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

當我用4.6編譯你的語法時,我有5個錯誤。第一個是沒有分號的'end'規則。對於標識識別的具體問題提出問題太長(400行)。例如,'command'規則與這個問題無關,我不打算去理解整個語法。你應該將它減少到解析'number foo = [+] 5'和'if(foo == 5)'所需的嚴格最小規則,否則沒有人會花時間回答你的問題。 – BernardK

+0

我可以把它砍下來。 –

+0

順便說一句,'開始'和'結束'不應該有分號。他們不是陳述,他們只是定義交易的開始和結束。 –

回答

0

我有一種預感,這使用的一個片段是不正確的:

fragment Sign : Plus | Minus; 

我找不到在參考書什麼,但我認爲它需要改變,以這樣的事:

fragment Sign : [+-]; 
0

我發現了這個問題。我使用的版本是4.5.2-1,因爲每次嘗試升級到4.7都會導致更多的錯誤,並且我不想在解決另一個錯誤時導致更多的錯誤。我終於打破了,並將庫升級到4.7,修復了錯誤,數字識別問題消失了。這一直是圖書館的一個錯誤。