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