2017-09-16 19 views
0

数字、小数、パーセントの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 
    : ~["\\\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

ところで、「begin」と「end」はセミコロンを持たないはずです。ステートメントではなく、トランザクションの開始と終了を定義するだけです。 –

答えて

0

私はフラグメントのこの使用が正しくないことを予感があります

fragment Sign : Plus | Minus; 

私は参考書に何かを見つけることができませんでしたが、私はそれがこのようなものに変更する必要がありだと思います:

fragment Sign : [+-]; 
0

この問題が見つかりました。バージョン4.5.2-1を使用していたのは、4.7にアップグレードしようとするたびにエラーが発生し、別のエラーを解決しようとしたときにエラーが発生したくないからです。私は最終的に壊して4.7にライブラリをアップグレードし、エラーを修正し、数字認識の問題は消えました。今度は、図書館のバグだった。