Model: statements+=Statement*; Statement returns Statement:(ConditionalElseBlock|Block|NonRecursingStatement) ';'? NL+ | HASH_COMMENT NL*; NonRecursingStatement returns Statement: (OpenDecl|Cat|Proc|Assignment|Msg|Decl|Include|NullStatement|Dbms|DbmsDecl|DbmsClose|DbmsWith|Break|Flush|Return|For|Annotation|Public|Params|Receive|Unload|SendBundle|Runreport|While|Switch); //SwitchStatement: (switch=Switch1 case=Case1 default=Default1); Switch : 'switch' (exp+=Expression) NL+ '{' NL+ (caseBlock+=Case NL+)+ (defaultBlock+=Default NL+)? '}'; Case: 'case' (exp+=Expression) NL+ '{' NL+ statementList+=Statement* '}'; Default: {Default}'default' NL+ '{' NL+ statementList+=Statement* '}'; Switch1 : 'switch' (exp+=Expression) NL+ (caseBlock+=Case1 NL+)+ (defaultBlock+=Default1)?; Case1: 'case' (exp+=Expression) NL+ (statementList+=Statement*); Default1: {Default}'default' NL+ (statementList+=Statement*); Receive returns Statement: {Statement} 'receive' ('bundle' (bundleName+=JPLID|STRING))? 'data' (exp+=Expression (','? exp+=Expression)*)?; SendBundle returns Statement: {Statement} 'send' 'bundle' (bundleName+=JPLID|STRING) 'data' (exp+=Expression (','? exp+=Expression)*)?; Annotation: '@app()->'jplId+=OneDecl; Widget: {Widget} '@widget'(exp+=Expression) ('->'exp+=Expression); FieldNum : '@field_num'(exp+=Expression) ('->'exp+=Expression); ScreenNum : {ScreenNum} ('@screen_num'|'@screen')(exp+=Expression) ('->'exp+=Expression); Runreport:'runreport' exp+=OpenDecl ('append')? ; Proc: ('proc') (exp+=Expression) (procBlock+=Block | right+=NonRecursingStatement)?; /* While Loop */ While: 'while' condition+=Expression jplNL+=JPLNL (block+=Block | right+=NonRecursingStatement) ; /* For Loop */ //For: ('for') (exp+=Expression) ('while') (exp+=Expression) (('step') (exp+=Expression))? jplNL+=JPLNL (block+=Block | right+=NonRecursingStatement); For: {For} ('for' ( forCondition+=ForCondition ) jplNL+=JPLNL (block+=Block | right+=NonRecursingStatement)); ForCondition: (exp+=Expression) ('while') (exp+=Expression) (('step') (exp+=Expression))?; /* If Statement */ IfStatement returns Statement: {Statement} ('if') '!'? exp+=OpenDecl; ElseStatement returns Statement: {Else}'else'; ElseIfStatement returns Statement: ('else' 'if') '!'? exp+=OpenDecl; ConditionalIfBlock returns Statement: IfStatement {ConditionalIfBlock.left=current} NL+ (block+=Block|right+=NonRecursingStatement|conditionalIfBlock+=ConditionalIfBlock) ; ConditionalElseIfBlock returns Statement: ConditionalIfBlock {ConditionalElseBlock.left=current} (NL+ elseif+=ElseIfStatement NL+ (block+=Block | right+=NonRecursingStatement))* ; ConditionalElseBlock returns Statement: ConditionalElseIfBlock {ConditionalElseBlock.left=current} (NL+ else+=ElseStatement NL+ (block+=Block | right+=NonRecursingStatement))? ; Block : (statements+=StartBlock) statementlist+=Statement* (statements+=EndBlock); NullStatement returns Statement : {NullStatement}'{''}'; StartBlock returns Statement : {StartBlock}name='{' NL+; EndBlock returns Statement : {EndBlock}name='}'; OpenDecl returns Statement : (exp+=Expression (','? exp+=Expression)*) ','?; Decl returns Statement : (name=('vars' | 'global') (exp+=Expression (','? exp+=Expression)*)) ','?; OneDecl: jplId+=JPLID ((isEmpty ?= '(' ')')? & (isArray ?= '[' (maxOccurs+=NUMBER) ']')? & (isRange ?= '[' (range+=RANGE) ']')? & (hasSize ?= '(' (varsize+=NUMBER|jplId+=JPLID|str+=STRING) (',' (varsize+=NUMBER|jplId+=JPLID|str+=STRING))* ')')? & (isArrayVar ?= '[' (jplId+=JPLID) ']')? & (hasExp ?= '[' (exp+=Expression) ']')? & (isString ?= '(' (str+=STRING) ')')?) ; Assignment: ('math')? (precision=Precision)? (oneDecl+=OneDecl) (exp+=Expression)*; Precision: '%'(width=NUMBER)|((width=NUMBER)?'.'(decimal_places=NUMBER)); /* Msg Emsg */ Msg: ('msg') name=Mode exp+=Expression; Mode: ('emsg' | 'err_reset' | 'qui_msg' | 'quiet' | 'setbkstat' | 'd_msg'); /* DBMS related queries */ DbmsKeyWords: ('dbms'|'sql'|'insert'|'into'|'values'|'delete'|'update'|'set'|'select'|'distinct'|'from'|'where'|'exists'|'in'|'is'|'any'|'all'|'some'|'and' |'or'|'left'|'right'|'inner'|'outer'|'join' |'char'|'datetime'|'float'|'int'|'long'|'create'|'table'|'database'|'drop'|'between'| 'group'|'by'|'having'|'like'| 'escape'|'order'|'asc'|'desc'|'not'|'null'|'count'|'avg'|'min'|'max' |'sum'|'primary'|'foreign'|'key'|'references'|'like'|'escape'|'with'|'engine'|'close'|'column_names'| 'connection'|'close_all_connections'|'declare cursor'|'cursors'|'continue'|'execute' |'using'|'rpc'|'alias'|'binary'|'catquery'| 'to'|'separator' |'heading'| 'on'|'off'|'column'|'names'|'format'|'occur'|'start'|'unique'|'connected'|'continue_bottom'|'continue_down'| 'continue_top'|'continue_up'|'store'|'file'|'onentry'|'onerror'| 'onexit'|'application' |'autocommit'|'begin'|'browse'|'cancel'|'commit'|'completion'|'run'|'rollback'|'user'|'database'| 'datasource'|'server'|'procedure'|'stored_sub'|'save'|'flush'|'timeout'|'transaction'); Dbms: 'dbms' key=JPLString; DbmsDecl: 'dbms' 'declare' 'cursor' jplId=JPLID; DbmsClose: 'dbms' 'close' 'cursor' jplId=JPLID; DbmsWith: 'dbms' 'with' 'cursor' jplId=JPLID; JPLID: (name=ID | (':'('+')? (name=ID | ('(' name=ID ')')))); JPLNL : name=NL; Break returns NUMBER: ('break') {NUMBER}(level=NUMBER)?; Flush: 'flush'; Return: {Return} 'return' (exp+=Expression)*; Cat:('cat') args+=JPLID(('['(value=NUMBER | val=JPLID) ']')? ('(' (v+=NUMBER(',' num+=NUMBER)*) ')')? STRING)? (str+=STRING)* (jp+=JPLID)*; Include returns Statement : name=('include') arg=Module; lengthOld:{lengthOld} ('length') exp+=Expression; lengthNew:{lengthNew} ('@length')exp+=Expression; Date: '@date' exp+=Expression; Sum: '@sum' exp+=Expression; Call: 'call' exp+=Expression; Unload:name =('unload') ags=Module; Module: ID ('.' ID)* ; Public: 'public' module+=Module (','? module+=Module)*; Expression: LogicalOr ; LogicalOr returns Expression: BitwiseOr ({LogicalOr.left=current} '||' right=BitwiseOr)* ; BitwiseOr returns Expression: LogicalAnd ({BitwiseOr.left=current} '|' right=LogicalAnd)* ; LogicalAnd returns Expression: BitwiseAnd ({LogicalAnd.left=current} '&&' right=BitwiseAnd)* ; BitwiseAnd returns Expression: Equivalency ({BitwiseAnd.left=current} '&' right=Equivalency)* ; Equivalency returns Expression: Relational ({Equivalency.left=current} ('=='|'!='|'=') right=Relational)* ; Relational returns Expression: PlusMinus ({Relational.left=current} ('>='|'<='|'>'|'<') right=PlusMinus)* ; PlusMinus returns Expression: DivMult ({PlusMinus.left=current} ('+'|'-') right=DivMult)* ; DivMult returns Expression: LogicalNot ({DivMult.left=current} ('/'|'*') right=LogicalNot)* ; LogicalNot returns Expression: OnesComplement ({LogicalNot.left=current} '!' right=OnesComplement)* ; OnesComplement returns Expression: Exponentiation ({OnesComplement.left=current} ('~') right=Exponentiation)* ; Exponentiation returns Expression: Concatenation ({Exponentialtion.left=current} '^' right=Concatenation)* ; Concatenation returns Expression: Primary ({Concatenation.left=current} '##' right=Primary)* ; Primary returns Expression: FieldNum | Widget | ScreenNum | Call | Date | Sum | lengthOld | lengthNew | OneDecl | ('+'|'-')? number+=NUMBER | jplString+=JPLString | '(' logicalOr+=LogicalOr (',' logicalOr+=LogicalOr)* ')' | '{' logicalOr+=LogicalOr (',' logicalOr+=LogicalOr)* '}' ; GSD returns Expression: JPLID {GSD.left=current} ('[' occurence=(NUMBER|STRING) ']')?('(' m=NUMBER (',' (n=NUMBER))? ')')? '->' right=JPLID ; Params returns Statement: name=('parms')('deref')? args+=JPLID (',' args+=JPLID)* ; JPLString : STRING; terminal ID :('a'..'z'|'A'..'Z'|'_'|'$'|'.'|'@')('a'..'z'|'A'..'Z'|'_'|'-'|'$'|'.'|'0'..'9'|'@')*; terminal STRING : '"' ( '\\'('"'|('\r'? '\n')) | !('\n'|'"') )* '"' | "'" ( '\\'("'"|('\r'? '\n')) | !('\n'|"'") )* "'"; terminal SL_COMMENT: '//' !('\n' | '\r')*; terminal HASH_COMMENT : ('#' !('#'|'\n'|'\r')* ('\r'? '\n')+) | (('#''#''#') !('\n'|'\r')* ('\r'? '\n')+); //terminal HASH_COMMENT : ('#'('\r'? '\n')?) | ('#' !('#'|'\n'|'\r')+ ('\r'? '\n')?) | (('#''#''#') !('\n'|'\r')* ('\r'? '\n')?); terminal WS : (' '|'\t'| ('\\'(' '* '\r'? '\n')))+; terminal NL : ('\r'? '\n')+; terminal NUMBER: (OCTAL|FLOAT|INT|BINARY|HEX); terminal OCTAL returns ecore::EInt: ('0')('0'..'7')+; terminal FLOAT returns ecore::EFloat: ('0'..'9' ('0'..'9')*) '.' ('0'..'9')*; terminal INT returns ecore::EInt: '0'..'9' ('0'..'9')*; terminal RANGE: '0'..'9' '..' ('0'..'9')*; terminal BINARY returns ecore::EInt: ('0b'|'0B') ('0'|'1')+; terminal HEX returns ecore::EInt:('0x'|'0X')('0'..'9'|'a'..'f'|'A'..'F')+;