grammar Ocl; options { output=AST; } tokens { LIB_NAME; LIB_HEADER; METAMODEL_DEF; IMPORT_DEF; REQUIRE_DEF; LIB_CONTENT; VISIBILITY; DEFINES_BLOCK; DEFINES_SET; DEFINE_UNIT; QUERIES_SET; QUERIES_CONTEXT; QUERIES_BLOCK; QUERY_UNIT; QUERY_TRIGGER; QUERY_MESSAGE; QUERY_NAME; QUERY_CONTENT; SEVERITY_LEVEL; TESTS_BLOCK; TEST_SET; TEST_MODEL; TESTS_SET; TEST_UNIT; TEST_NAME; TEST_CONTENT; EXPECTED_RESULT_SET; EXPECTED_RESULT; } library : 'library' String libHeader? libContent+ 'endlibrary' -> ^( LIB_NAME String) ^( LIB_HEADER libHeader?) ^( LIB_CONTENT libContent+); libHeader : metamodeldef? importdef* -> ^( METAMODEL_DEF metamodeldef?) ^(IMPORT_DEF importdef*); importdef : 'require' libName -> ^( REQUIRE_DEF libName); metamodeldef : 'metamodel' modelName -> modelName; libContent : visibilityKind (defines -> ^(DEFINES_BLOCK ^(VISIBILITY visibilityKind) defines) | queries -> ^(QUERIES_BLOCK ^(VISIBILITY visibilityKind) queries) | tests -> ^(TESTS_BLOCK ^(VISIBILITY visibilityKind) tests)); defines : 'definitions' definesBlock+ 'enddefinitions' -> ^(DEFINES_SET definesBlock+); definesBlock : extContextDeclaration evaluation -> ^(DEFINE_UNIT extContextDeclaration evaluation); extContextDeclaration : ('context' String) | ('nonecontext') ->; queries : 'queries' queriesBlock+ 'endqueries'-> queriesBlock+; queriesBlock : extContextDeclaration query+ -> ^(QUERIES_CONTEXT extContextDeclaration) ^(QUERIES_SET query+); query : queryHeader trigger? message? -> ^(QUERY_UNIT queryHeader ^(QUERY_TRIGGER trigger?) ^(QUERY_MESSAGE message)); trigger : 'trigger' evaluation -> evaluation; queryHeader : 'query' String? ':' severityLevel? evaluation -> ^(QUERY_NAME String?) ^(SEVERITY_LEVEL severityLevel?) ^(QUERY_CONTENT evaluation); severityLevel : 'severity' String -> String; evaluation : (String|Characters)+ .*; message : 'message' composedString 'endmessage' -> composedString; quotedString : '"' (EscapeSequence | ~('\\'|'"'))* '"'; composedString : (quotedString| .* ) ('+' composedString)*; tests : 'tests' testSettings testUnit+ 'endtests'-> ^(TEST_MODEL testSettings) ^(TESTS_SET testUnit+); testSettings : ('model' modelName)? -> modelName; testUnit: 'test' String? ':' evaluation expectedResult+ -> ^(TEST_UNIT ^(TEST_NAME String?) ^(TEST_CONTENT evaluation) ^(EXPECTED_RESULT_SET expectedResult+)); expectedResult : 'expected' evaluation -> ^(EXPECTED_RESULT evaluation); visibilityKind : 'private' | 'protected' | 'public'; libName : qualifiedName; modelName : qualifiedName; qualifiedName : String ('.' String)*; String : (Letter|Digit)+; /* 0..9 | Different Alphabets */ Digit : '\u0030'..'\u0039' | '\u0660'..'\u0669' | '\u06f0'..'\u06f9' | '\u0966'..'\u096f' | '\u09e6'..'\u09ef' | '\u0a66'..'\u0a6f' | '\u0ae6'..'\u0aef' | '\u0b66'..'\u0b6f' | '\u0be7'..'\u0bef' | '\u0c66'..'\u0c6f' | '\u0ce6'..'\u0cef' | '\u0d66'..'\u0d6f' | '\u0e50'..'\u0e59' | '\u0ed0'..'\u0ed9' | '\u1040'..'\u1049' ; /* $ | A..Z | _ | a..z | À..Ö | Ø..ö | ø..ÿ | Different Alphabets */ fragment Letter : '\u0024' | '\u0041'..'\u005a' | '\u005f' | '\u0061'..'\u007a' | '\u00c0'..'\u00d6' | '\u00d8'..'\u00f6' | '\u00f8'..'\u00ff' | '\u0100'..'\u1fff' | '\u3040'..'\u318f' | '\u3300'..'\u337f' | '\u3400'..'\u3d2d' | '\u4e00'..'\u9fff' | '\uf900'..'\ufaff' ; Characters : '='|'>'|'<'|'('|')'|'{'|'}'|','|'-'| ';'|'%'|'|'|'!'|'@'|'`'|'´'|'~'|'#'| '&'|'^'|'\\'|'['|']'|'?'|'/'|'*'|'\''; fragment EscapeSequence : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\'); WS : (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel = HIDDEN;} ; COMMENT : '/*' .* '*/' {$channel=HIDDEN;} ; LINE_COMMENT : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} ; OCL_LINE_COMMENT : '--' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;};