6 ASTLabelType=CommonTree;
63 @parser::header { package org.simantics.graph.compiler.internal.parsing; }
64 @lexer::header { package org.simantics.graph.compiler.internal.parsing;
66 import gnu.trove.list.array.*;
72 TIntArrayList iStack = new TIntArrayList();
75 List tokens = new ArrayList();
76 public void emit(Token token) {
80 public Token nextToken() {
81 if(tokens.isEmpty()) {
83 if ( tokens.isEmpty() ) {
84 /* When end-of-file is encountered, we
85 emit balancing number of DEDENT tokens.
87 if(iStack.size() <= 1)
90 while(iStack.size() > 1) {
91 iStack.removeAt(iStack.size()-1);
99 return (Token)tokens.remove(0);
104 // ------------------------------------------------------------------
106 // ------------------------------------------------------------------
108 ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
112 : '//' ~('\n')* {$channel=HIDDEN;}
113 | '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
122 LPAREN : '(' { ++ inParen; } ;
123 RPAREN : ')' { -- inParen; } ;
124 LBRACKET : '[' { ++ inParen; } ;
125 RBRACKET : ']' { -- inParen; } ;
126 LCURLY : '{' { ++ inParen; } ;
127 RCURLY : '}' { -- inParen; } ;
129 INT_RANGE : INT '..' INT?
132 RANGE : FLOAT '..' (FLOAT | INT)?
138 @init { int spaces = 0; }
141 | '//' ~('\n')* '\n' { spaces = 0; }
142 | '/*' ( options {greedy=false;} : . )* '*/'
144 | '\n' { spaces = 0; }
153 while(iStack.size() > 1) {
154 iStack.removeAt(iStack.size()-1);
162 int stackTop = iStack.get(iStack.size()-1);
163 if(spaces > stackTop) {
167 else if(spaces < stackTop) {
168 while(spaces < iStack.get(iStack.size()-1)) {
169 iStack.removeAt(iStack.size()-1);
173 state.type = NEWLINE;
175 // TODO check that spaces == iStack.get(iStack.size()-1)
181 INDENT: { false }?=> 'INDENT' ;
182 DEDENT: { false }?=> 'DEDENT' ;
189 ( ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
190 | ('0'..'9')+ EXPONENT
195 : '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
196 | '"""' ( ~('"') | '"' ~('"') | '""' ~('"') )* '"""'
200 : '<http:' ( ~('>') )* '>'
204 EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
207 HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
211 : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
217 : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
220 // ------------------------------------------------------------------
222 // ------------------------------------------------------------------
224 file : NEWLINE? resourceDefinitions? EOF -> ^(FILE resourceDefinitions?) ;
227 : resourceDefinition (NEWLINE! resourceDefinition)*
233 (INDENT property (NEWLINE property)* DEDENT)?
234 -> ^(RESOURCE resource localProperty* property*)
235 | template -> ^(RESOURCE ^(BLANK template) template)
240 -> ^(PROPERTY relation ^(RESOURCE resource))
245 ( resourceDefinition -> ^(PROPERTY relation resourceDefinition)
246 | INDENT resourceDefinitions DEDENT -> ^(PROPERTY relation resourceDefinitions)
253 ( {input.LT(1).getText().equals("template")}?=>
255 INDENT resourceDefinitions DEDENT
256 -> ^(TEMPLATE_DEFINITION resource+ resourceDefinitions)
258 (INDENT resourceDefinitions DEDENT)?
259 -> ^(TEMPLATE_INSTANCE resource+ resourceDefinitions?)
263 // ------------------------------------------------------------------
265 // ------------------------------------------------------------------
269 ('.' ID -> ^(REF $relation ID))*
272 | '<R' -> SUBRELATION_OF
273 | '<--' -> HAS_DOMAIN
275 | '==>' -> REQUIRES_VALUE_TYPE
279 | '%' ID -> ^(VARIABLE ID)
283 : ( {input.LT(1).getText().equals("_")}?=> ID -> ^(BLANK ID)
285 ('.' (ID -> ^(REF $resource ID)
286 |STRING -> ^(REF $resource STRING)
290 | simpleValue -> ^(EMBEDDED_VALUE simpleValue)
291 | '$' basicType -> ^(EMBEDDED_TYPE basicType)
292 | '%' ID -> ^(VARIABLE ID)
295 // ------------------------------------------------------------------
297 // ------------------------------------------------------------------
299 /*typeDefinitions : typeDefinition* -> ^(TYPE_DEFINITIONS typeDefinition*);
302 : 'type' ID '=' type -> ^(TYPE_DEFINITION ID type)
313 ('|' unionComponent)+
314 -> ^(UNION_TYPE unionComponent+)
317 unionComponent : ID ((arrayType) => arrayType)? -> ^(TYPE_COMPONENT ID arrayType?) ;
320 : (basicType -> basicType)
321 (LBRACKET arrayLength? RBRACKET -> ^(ARRAY_TYPE $arrayType arrayLength?))* ;
335 : LPAREN (type (',' type)*)? RPAREN
336 -> ^(TUPLE_TYPE type*)
340 : LCURLY (component (',' component)*)? RCURLY
341 -> ^(RECORD_TYPE component*)
346 -> ^(TYPE_COMPONENT ID type)
350 : ID ((LPAREN)=> LPAREN parameter (',' parameter)* RPAREN)?
351 -> ^(TYPE_REFERENCE ID parameter*)
355 : ID '=' parameterValue -> ^(TYPE_ANNOTATION ID parameterValue)
363 | rangePar -> ^(RANGE rangePar)
366 rangePar : (LBRACKET | LPAREN) range (RBRACKET | RPAREN) ;
388 // ------------------------------------------------------------------
390 // ------------------------------------------------------------------
392 valueDefinitions : valueDefinition* -> ^(VALUE_DEFINITIONS valueDefinition*);
395 : ID ':' type '=' value
396 -> ^(VALUE_DEFINITION ID type value)
400 : (basicValue -> basicValue)
401 (':' type -> ^(VARIANT type $value))*
407 | {input.LT(1).getText().equals("null")}? ID -> NO_VALUE
421 : LBRACKET (value (',' value)*)? RBRACKET
426 : LPAREN (value (',' value)*)? RPAREN
432 -> ^(TAGGED_VALUE ID simpleValue?)
436 : LCURLY (recordAssignment (',' recordAssignment)*)? RCURLY
437 -> ^(RECORD recordAssignment*)
442 -> ^(ASSIGNMENT ID value)
445 map : {input.LT(1).getText().equals("map")}?=> ID LCURLY (mapAssignment (',' mapAssignment)*)? RCURLY
446 -> ^(MAP mapAssignment*)
451 -> ^(ASSIGNMENT value*)