--- /dev/null
+grammar SimanticsData;\r
+\r
+options {\r
+ language = C;\r
+ output = AST;\r
+ ASTLabelType=pANTLR3_BASE_TREE;\r
+}\r
+\r
+tokens {\r
+ TYPE_DEFINITIONS;\r
+ TYPE_DEFINITION; \r
+\r
+ UNION_TYPE; \r
+ RECORD_TYPE;\r
+ TUPLE_TYPE;\r
+ ARRAY_TYPE;\r
+ TYPE_REFERENCE;\r
+ TYPE_ANNOTATION; \r
+ TYPE_COMPONENT;\r
+ \r
+ VALUE_DEFINITIONS;\r
+ VALUE_DEFINITION;\r
+\r
+ NO_VALUE; \r
+ VARIANT;\r
+ ARRAY;\r
+ TUPLE;\r
+ TAGGED_VALUE;\r
+ RECORD;\r
+ MAP;\r
+ ASSIGNMENT;\r
+}\r
+\r
+ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*\r
+ ;\r
+\r
+INT : '-'? '0'..'9'+\r
+ ;\r
+\r
+FLOAT\r
+ : '-'? ('0'..'9')+ '.' ('0'..'9')+ EXPONENT?\r
+ //| '-'? '.' ('0'..'9')+ EXPONENT?\r
+ | '-'? ('0'..'9')+ EXPONENT\r
+ ;\r
+\r
+COMMENT\r
+ : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}\r
+ | '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}\r
+ ;\r
+\r
+WS : ( ' '\r
+ | '\t'\r
+ | '\r'\r
+ | '\n'\r
+ ) {$channel=HIDDEN;}\r
+ ;\r
+\r
+STRING\r
+ : '"' ( ESC_SEQ | ~('\\'|'"') )* '"'\r
+ | '"""' ( ~('"') | '"' ~('"') | '""' ~('"') )* '"""'\r
+ ;\r
+\r
+fragment\r
+EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;\r
+\r
+fragment\r
+HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;\r
+\r
+fragment\r
+ESC_SEQ\r
+ : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')\r
+ | UNICODE_ESC\r
+ | OCTAL_ESC\r
+ ;\r
+\r
+fragment\r
+OCTAL_ESC\r
+ : '\\' ('0'..'3') ('0'..'7') ('0'..'7')\r
+ | '\\' ('0'..'7') ('0'..'7')\r
+ | '\\' ('0'..'7')\r
+ ;\r
+\r
+fragment\r
+UNICODE_ESC\r
+ : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT\r
+ ;\r
+ \r
+/* -----------------------------------------------------------\r
+ TYPE DEFINITIONS \r
+ ----------------------------------------------------------- */\r
+ \r
+ \r
+typeDefinitions : typeDefinition* -> ^(TYPE_DEFINITIONS typeDefinition*);\r
+\r
+typeDefinition \r
+ : 'type' ID '=' unionType -> ^(TYPE_DEFINITION ID unionType)\r
+ ;\r
+ \r
+unionType \r
+ : type\r
+ | ('|' unionComponent)+\r
+ -> ^(UNION_TYPE unionComponent+)\r
+ ;\r
+ \r
+unionComponent : ID type? -> ^(TYPE_COMPONENT ID type?) ;\r
+\r
+type \r
+ : (basicType -> basicType)\r
+ ('[' arrayLength? ']' -> ^(ARRAY_TYPE $type arrayLength?))* ;\r
+\r
+arrayLength \r
+ : INT\r
+ | INT '..'\r
+ | '..' INT \r
+ | INT '..' INT\r
+ ;\r
+\r
+basicType \r
+ : tupleType\r
+ | recordType\r
+ | typeReference\r
+ ;\r
+ \r
+tupleType \r
+ : '(' (unionType (',' unionType)*)? ')' \r
+ -> ^(TUPLE_TYPE unionType*) \r
+ ;\r
+\r
+recordType \r
+ : '{' (component (',' component)*)? '}' \r
+ -> ^(RECORD_TYPE component*)\r
+ ;\r
+\r
+component \r
+ : ID ':' unionType \r
+ -> ^(TYPE_COMPONENT ID unionType) \r
+ ;\r
+\r
+typeReference \r
+ : ID ('(' parameter (',' parameter)* ')')? \r
+ -> ^(TYPE_REFERENCE ID parameter*)\r
+ ;\r
+\r
+parameter \r
+ : ID '=' parameterValue -> ^(TYPE_ANNOTATION ID parameterValue)\r
+ | unionType \r
+ ;\r
+\r
+parameterValue \r
+ : string\r
+ | boolean\r
+ | number\r
+ | ('[' | '(') range (']' | ')')\r
+ ;\r
+ \r
+range\r
+ : number\r
+ | number '..'\r
+ | '..' number \r
+ | number '..' number\r
+ ; \r
+ \r
+number\r
+ : INT\r
+ | FLOAT\r
+ ;\r
+\r
+string\r
+ : STRING\r
+ ;\r
+ \r
+boolean\r
+ : 'true'\r
+ | 'false'\r
+ ;\r
+\r
+/* -----------------------------------------------------------\r
+ VALUE DEFINITIONS \r
+ ----------------------------------------------------------- */\r
+\r
+valueDefinitions : valueDefinition* -> ^(VALUE_DEFINITIONS valueDefinition*);\r
+\r
+valueDefinition \r
+ : ID ':' unionType '=' value\r
+ -> ^(VALUE_DEFINITION ID unionType value) \r
+ ;\r
+\r
+value \r
+ : (basicValue -> basicValue)\r
+ (':' type -> ^(VARIANT type $value))* \r
+ ;\r
+\r
+basicValue \r
+ : 'null' -> NO_VALUE\r
+ | string\r
+ | number\r
+ | boolean\r
+ | array\r
+ | tuple\r
+ | taggedValue\r
+ | map\r
+ | record\r
+ ;\r
+\r
+array \r
+ : '[' (value (',' value)*)? ']'\r
+ -> ^(ARRAY value*) \r
+ ;\r
+\r
+tuple \r
+ : '(' (value (',' value)*)? ')'\r
+ -> ^(TUPLE value*) \r
+ ;\r
+\r
+taggedValue \r
+ : ID basicValue\r
+ -> ^(TAGGED_VALUE ID basicValue) \r
+ ;\r
+\r
+record \r
+ : '{' (recordAssignment (',' recordAssignment)*)? '}'\r
+ -> ^(RECORD recordAssignment*) \r
+ ;\r
+\r
+recordAssignment \r
+ : ID '=' value\r
+ -> ^(ASSIGNMENT ID value)\r
+ ;\r
+\r
+map : 'map' '{' (mapAssignment (',' mapAssignment)*)? '}'\r
+ -> ^(MAP mapAssignment*) \r
+ ;\r
+\r
+mapAssignment \r
+ : value '=' value\r
+ -> ^(ASSIGNMENT value*) \r
+ ;
\ No newline at end of file