Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- grammar Expression;
- options {
- output=AST;
- language=CSharp;
- }
- tokens {
- Minus='-';
- Plus='+';
- Star='*';
- Slash='/';
- GT='>';
- LT='<';
- EQ1='=';
- EQ2='==';
- GE='>=';
- LE='<=';
- NE1='!=';
- NE2='<>';
- And='\u0438';
- Or='\u0438\u043B\u0438';
- Not='\u043D\u0435';
- Function='(';
- TimeFrame='{';
- TimeFrameSeparator=':';
- ControlCell='[';
- January='\u044F\u043D\u0432\u0430\u0440\u044C';
- February='\u0444\u0435\u0432\u0440\u0430\u043B\u044C';
- March='\u043C\u0430\u0440\u0442';
- April='\u0430\u043F\u0440\u0435\u043B\u044C';
- May='\u043C\u0430\u0439';
- June='\u0438\u044E\u043D\u044C';
- July='\u0438\u044E\u043B\u044C';
- August='\u0430\u0432\u0433\u0443\u0441\u0442';
- September='\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C';
- October='\u043E\u043A\u0442\u044F\u0431\u0440\u044C';
- November='\u043D\u043E\u044F\u0431\u0440\u044C';
- December='\u0434\u0435\u043A\u0430\u0431\u0440\u044C';
- FirstQuarter='\u043F\u0435\u0440\u0432\u044B\u0439\u043A\u0432\u0430\u0440\u0442\u0430\u043B';
- SecondQuarter='\u0432\u0442\u043E\u0440\u043E\u0439\u043A\u0432\u0430\u0440\u0442\u0430\u043B';
- ThirdQuarter='\u0442\u0440\u0435\u0442\u0438\u0439\u043A\u0432\u0430\u0440\u0442\u0430\u043B';
- FourthQuarter='\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044B\u0439\u043A\u0432\u0430\u0440\u0442\u0430\u043B';
- Today='\u0441\u0435\u0433\u043E\u0434\u043D\u044F';
- CurrentMonth='\u0442\u0435\u043A\u0443\u0449\u0438\u0439\u043C\u0435\u0441\u044F\u0446';
- CurrentQuarter='\u0442\u0435\u043A\u0443\u0449\u0438\u0439\u043A\u0432\u0430\u0440\u0442\u0430\u043B';
- CurrentYear='\u0442\u0435\u043A\u0443\u0449\u0438\u0439\u0433\u043E\u0434';
- CurrentTimeFrame='\u0442\u0435\u043A\u0443\u0449\u0438\u0439\u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B';
- BeginOfTimeFrame='\u043D\u0430\u0447\u0430\u043B\u043E\u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0430';
- EndOfTimeFrame='\u043A\u043E\u043D\u0435\u0446\u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0430';
- FQIdent='\u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440';
- Year='\u0433\u043E\u0434';
- Year2='\u0433\u043E\u0434\u0430';
- Year3='\u043B\u0435\u0442';
- Quarter='\u043A\u0432\u0430\u0440\u0442\u0430\u043B';
- Quarter2='\u043A\u0432\u0430\u0440\u0442\u0430\u043B\u0430';
- Quarter3='\u043A\u0432\u0430\u0440\u0442\u0430\u043B\u043E\u0432';
- Month='\u043C\u0435\u0441\u044F\u0446';
- Month2='\u043C\u0435\u0441\u044F\u0446\u0430';
- Month3='\u043C\u0435\u0441\u044F\u0446\u0435\u0432';
- Week='\u043D\u0435\u0434\u0435\u043B\u044F';
- Week2='\u043D\u0435\u0434\u0435\u043B\u0438';
- Week3='\u043D\u0435\u0434\u0435\u043B\u044C';
- Day='\u0434\u0435\u043D\u044C';
- Day2='\u0434\u043D\u044F';
- Day3='\u0434\u043D\u0435\u0439';
- DayNumber='\u0447\u0438\u0441\u043B\u043E';
- DayOfWeek='\u0434\u0435\u043D\u044C\u043D\u0435\u0434\u0435\u043B\u0438';
- DateFunction='\u0434\u0430\u0442\u0430';
- IfFunction='\u0435\u0441\u043B\u0438';
- True1='\u0438\u0441\u0442\u0438\u043D\u0430';
- True2='true';
- False1='\u043B\u043E\u0436\u044C';
- False2='false';
- }
- @namespace {Mosenergo.Asko.Eval}
- @lexer::header {
- }
- @header {
- using System.Collections.Generic;
- }
- @rulecatch {
- catch (RecognitionException re) {
- RememberError(re);
- Recover(input, re);
- }
- }
- @members {
- private IList<RecognitionException> errors = new List<RecognitionException>();
- public IList<RecognitionException> GetErrors() {
- return errors;
- }
- protected void RememberError(RecognitionException re) {
- if (errorRecovery) {
- return;
- }
- errorRecovery = true;
- errors.Add(re);
- }
- protected override void Mismatch(IIntStream input, int ttype, BitSet follow) {
- MismatchedTokenException mte = new MismatchedTokenException(ttype, input);
- RememberError(mte);
- RecoverFromMismatchedToken(input, mte, ttype, follow);
- }
- }
- expr
- : anyExpr EOF
- ;
- finally {
- if ( errors.Count > 0) {
- throw errors[0];
- }
- }
- anyExpr
- : addExpr ((LT | LE | GT | GE | EQ1 | EQ2 | NE1 | NE2)^ addExpr)?
- | boolFunction
- | boolLiteral
- | StringLiteral
- ;
- boolLiteral
- : True1
- | True2
- | False1
- | False2
- ;
- addExpr
- : mulExpr ((Minus|Plus)^ mulExpr)*
- ;
- mulExpr
- : unaryExpr ((Star|Slash)^ unaryExpr)*
- ;
- unaryExpr
- : unaryExprNotPlusMinus
- | Minus^ unaryExprNotPlusMinus
- | Plus^ unaryExprNotPlusMinus
- ;
- unaryExprNotPlusMinus
- : primary
- ;
- primary
- : valueReference
- | functionCall
- | literal
- | '('! addExpr ')'!
- ;
- valueReference
- : ControlCellId (TimeFrame^ timeFrameExpr '}'!)?
- ;
- ControlCellId
- : ControlCell
- ControlCellIdFragment ':' // Maket
- ControlCellIdFragment ':' // Filial
- ControlCellIdFragment ':' // Object Group
- ControlCellIdFragment ':' // Object Subgroup
- (ControlCellIdFragment ':') * // Additional Arguments
- ControlCellIdFragment // Indicator
- ']'!
- ;
- fragment
- ControlCellIdFragment
- : ~(':'|']')*
- ;
- timeFrameExpr
- :
- ( CurrentTimeFrame
- | timeFrameFunction
- | timeFrameLiteral
- | timeFrameExprInternals
- ) ((Minus^|Plus^) DecimalLiteral timeFrameOffsetUnit?)?
- ;
- timeFrameExprInternals
- : TimeFrame^ timeFrameExpr '}'!
- ;
- functionCall
- : DayNumber Function^ dateFunction ')'!
- | Month Function^ dateFunction ')'!
- | Year Function^ dateFunction ')'!
- | DayOfWeek Function^ dateFunction ')'!
- | Week Function^ dateFunction ')'!
- | Quarter Function^ dateFunction ')'!
- | IfFunction Function^ boolArg ','! argument ','! argument ')'!
- | id Function^ (argument (','! argument)*)? ')'!
- ;
- boolArg
- : comparable (LT | LE | GT | GE | EQ1 | EQ2 | NE1 | NE2)^ comparable
- | boolFunction
- | boolLiteral
- ;
- comparable
- : addExpr
- | StringLiteral
- ;
- boolFunction
- : andOrFunction
- | notFunction
- ;
- notFunction
- : Not Function^ boolArg ')'!
- ;
- andOrFunction
- : (And|Or) Function^ boolArg (','! boolArg)+ ')'!
- ;
- argument
- : timeFrameExpr2
- | addExpr
- | idFunction
- | dateFunction
- | StringLiteral
- ;
- timeFrameExpr2
- : TimeFrame^ timeFrameExpr2Internals '}'!
- ;
- timeFrameExpr2Internals
- :
- ( timeFrameFunction
- | timeFrameLiteral
- | timeFrameExpr2
- ) ((Minus^|Plus^) DecimalLiteral timeFrameOffsetUnit?)?
- ;
- timeFrameOffsetUnit
- : Year
- | Year2
- | Year3
- | Quarter
- | Quarter2
- | Quarter3
- | Month
- | Month2
- | Month3
- | Week
- | Week2
- | Week3
- | Day
- | Day2
- | Day3
- ;
- timeFrameFunction
- : CurrentTimeFrame Function^ ControlCellId ')'!
- ;
- idFunction
- : FQIdent Function^ ControlCellId ')'!
- ;
- timeFrameLiteral
- : SingleDayTimeFrame
- | Today
- | January
- | February
- | March
- | April
- | May
- | June
- | July
- | August
- | September
- | October
- | November
- | December
- | CurrentMonth
- | FirstQuarter
- | SecondQuarter
- | ThirdQuarter
- | FourthQuarter
- | CurrentQuarter
- | CurrentYear
- | dateForTimeFrame TimeFrameSeparator^ dateForTimeFrame
- ;
- dateForTimeFrame
- : beginOfTimeFrame
- | endOfTimeFrame
- | SingleDayTimeFrame
- | Today
- ;
- dateFunction
- : dateForTimeFrame
- | createDateFunction
- ;
- createDateFunction
- : DateFunction Function^ addExpr ','! addExpr ','! addExpr ')'!
- ;
- beginOfTimeFrame
- : BeginOfTimeFrame Function^ timeFrameExpr2 ')'!
- ;
- endOfTimeFrame
- : EndOfTimeFrame Function^ timeFrameExpr2 ')'!
- ;
- id
- : ID^
- ;
- literal
- : DecimalLiteral
- | FloatingPointLiteral
- ;
- // $<TimeFrames
- SingleDayTimeFrame
- : DayTimeFrame
- ;
- fragment
- DayTimeFrame
- : ('0'..'9')? ('0'..'9') '.' MonthTimeFrame
- ;
- fragment
- MonthTimeFrame
- : ('0'..'9')? ('0'..'9') '.' YearTimeFrame
- ;
- fragment
- YearTimeFrame
- : (('0'..'9') ('0'..'9'))? ('0'..'9') ('0'..'9')
- ;
- // $>
- // $<Literals
- DecimalLiteral
- : ('0' | '1'..'9' '0'..'9'*)
- ;
- FloatingPointLiteral
- : ('0'..'9')+ '.' ('0'..'9')* Exponent?
- | '.' ('0'..'9')+ Exponent?
- | ('0'..'9')+ Exponent
- ;
- fragment
- Exponent
- : ('e'|'E') (Plus|Minus)? ('0'..'9')+
- ;
- StringLiteral
- : '"' ( EscapeSequence | ~('\\'|'"') )* '"'
- ;
- fragment
- EscapeSequence
- : '\\' ('\"'|'\''|'\\')
- ;
- // $>
- ID : Letter (Letter | '0'..'9' | '\u005f')*
- ;
- fragment
- Letter :
- '\u0041'..'\u005a' |
- '\u0061'..'\u007a' |
- '\u00c0'..'\u00d6' |
- '\u00d8'..'\u00f6' |
- '\u00f8'..'\u00ff' |
- '\u0100'..'\u1fff' |
- '\u3040'..'\u318f' |
- '\u3300'..'\u337f' |
- '\u3400'..'\u3d2d' |
- '\u4e00'..'\u9fff' |
- '\uf900'..'\ufaff'
- ;
- WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
- ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement