Guest User

Untitled

a guest
Apr 19th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.36 KB | None | 0 0
  1. grammar Textuml;
  2.  
  3. options{output=AST;}
  4.  
  5. tokens{
  6. ATTRIBUTE;
  7. CLASS;
  8. CLASS_DEF;
  9. FEATURE;
  10. IN;
  11. OPERATION;
  12. OUT;
  13. PACKAGE;
  14. PACKAGE_DECL;
  15. PACKAGE_ID;
  16. PRIMITIVE;
  17. PROFILE_ID;
  18. SIGNATURE;
  19. STEREOTYPE;
  20. VISIBILITY;
  21. }
  22.  
  23. // START :members
  24.  
  25. @header {
  26. package org.textuml.grammar;
  27. import java.util.Vector;
  28. }
  29.  
  30. @members {
  31. private Vector <String> classAttributes = new Vector ();
  32. private Vector <String> classNames = new Vector ();
  33. private Vector <String> classOperations = new Vector ();
  34. private Vector <String> primitives = new Vector ();
  35. private Vector <String> usedSymbols = new Vector ();
  36. public ArrayList<String> messages = new ArrayList<String>();
  37.  
  38. private void addSymbol (String symbol){
  39. if (!usedSymbols.contains (symbol))
  40. usedSymbols.add ( symbol );
  41. }
  42. }
  43.  
  44. //END :members
  45.  
  46. start :( package_heading namespace_content{
  47. for (String symbol : usedSymbols ) {
  48. if (!primitives.contains (symbol))
  49. if (!classNames.contains (symbol))
  50. messages.add ("Cannot find symbol " + symbol);
  51. }
  52. }
  53. | profile_heading profile_content
  54. )
  55. END! DOT!;
  56.  
  57.  
  58. package_heading : PACKAGE IDENTIFIER SEMICOLON -> ^(PACKAGE_ID IDENTIFIER);
  59. profile_heading : PROFILE IDENTIFIER SEMICOLON -> ^(PROFILE_ID IDENTIFIER);
  60.  
  61. profile_content : stereotype*;
  62. stereotype : STEREOTYPE IDENTIFIER EXTENDS UML COLON COLON stereotype_super END SEMICOLON -> ^(STEREOTYPE IDENTIFIER stereotype_super);
  63.  
  64. stereotype_super : SCLASS | PPROPERTY;
  65.  
  66. namespace_content : top_level_element*;
  67. top_level_element : top_level_element_choice;
  68.  
  69. top_level_element_choice : class_def | primitive_def ;
  70.  
  71.  
  72. primitive_def : PRIMITIVE IDENTIFIER{
  73. if ( primitives.contains($IDENTIFIER.text) ) {
  74. messages.add("Primitive \"" + $IDENTIFIER.text + "\" already defined" );
  75. }else {
  76. primitives.add($IDENTIFIER.text);
  77. }
  78. }SEMICOLON -> ^(PRIMITIVE IDENTIFIER) ;
  79.  
  80. class_def : class_header{
  81. classOperations.clear();
  82. classAttributes.clear();
  83. }
  84. feature_decl_list? END SEMICOLON ->^(CLASS class_header feature_decl_list*);
  85.  
  86. class_header : class_type IDENTIFIER{
  87. if (classNames.contains($IDENTIFIER.text))
  88. messages.add("Class \"" + $IDENTIFIER.text + "\" already defined" );
  89. else
  90. classNames.add($IDENTIFIER.text);
  91. } -> IDENTIFIER;
  92.  
  93. class_type: CLASS ;
  94.  
  95. feature_decl_list : feature_decl feature_decl_list? ;
  96.  
  97. feature_decl : modifiers feature_type -> ^(FEATURE modifiers* feature_type) ;
  98.  
  99. modifiers : modifier_list?;
  100.  
  101. modifier_list : modifier;
  102.  
  103. modifier : visibility_modifier ;
  104.  
  105. visibility_modifier : PUBLIC -> PUBLIC
  106. | PRIVATE -> PRIVATE ;
  107.  
  108. feature_type : operation_decl -> operation_decl
  109. | attribute_decl -> attribute_decl ;
  110.  
  111. attribute_decl : ATTRIBUTE IDENTIFIER{
  112. if (classAttributes.contains ($IDENTIFIER.text))
  113. messages.add ("Class Attribute " + $IDENTIFIER.text + " is already defined");
  114. else
  115. classAttributes.add ($IDENTIFIER.text);
  116. }
  117. COLON type_identifier SEMICOLON -> ^(ATTRIBUTE IDENTIFIER type_identifier);
  118.  
  119. type_identifier: IDENTIFIER{
  120. addSymbol ($IDENTIFIER.text);
  121. };
  122.  
  123. operation_decl : operation_header ;
  124.  
  125. operation_header: OPERATION IDENTIFIER{
  126. if (classOperations.contains ($IDENTIFIER.text))
  127. messages.add ("Class operation " + $IDENTIFIER.text + " is already defined");
  128. else
  129. classOperations.add ($IDENTIFIER.text);
  130. }
  131. signature SEMICOLON -> ^(OPERATION IDENTIFIER signature) ;
  132.  
  133. signature : L_PAREN param_decl_list? R_PAREN optional_return_type? -> ^(SIGNATURE param_decl_list? optional_return_type?) ;
  134.  
  135. optional_return_type : COLON type_identifier -> ^(OUT type_identifier) ;
  136.  
  137. param_decl_list : param_decl param_decl_list_tail? ;
  138.  
  139. param_decl_list_tail : COMMA! param_decl param_decl_list_tail?;
  140.  
  141. param_decl : IDENTIFIER COLON type_identifier -> ^(IN IDENTIFIER type_identifier) ;
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149. //Tokens
  150.  
  151. APPLY : 'apply' ;
  152. ATTRIBUTE : 'attribute' ;
  153. CLASS : 'class' ;
  154. END : 'end' ;
  155. EXTENDS : 'extends' ;
  156. OPERATION : 'operation' ;
  157. PACKAGE : 'package' ;
  158. SCLASS : 'Class' ;
  159. PRIMITIVE : 'primitive' ;
  160. PRIVATE : 'private' ;
  161. PROFILE : 'profile' ;
  162. PPROPERTY : 'Property' ;
  163. PUBLIC : 'public' ;
  164. STEREOTYPE : 'stereotype' ;
  165. UML : 'uml' ;
  166.  
  167.  
  168.  
  169. // separator symbols
  170.  
  171.  
  172. COLON : ':' ;
  173. COMMA : ',' ;
  174. DOT : '.' ;
  175. L_PAREN : '(' ;
  176. R_PAREN : ')' ;
  177. OPEN_SQ_BRACKET : '[' ;
  178. CLOSE_SQ_BRACKET : ']' ;
  179. SEMICOLON : ';' ;
  180.  
  181.  
  182.  
  183. //Helpers
  184.  
  185.  
  186.  
  187.  
  188. IDENTIFIER : ( ANY_LETTER ) (ANY_LETTER |UNDERSCORE |DIGIT )* ;
  189.  
  190.  
  191.  
  192. fragment
  193. ANY_LETTER
  194. : 'A'..'Z' | 'a'..'z';
  195.  
  196. fragment
  197. DIGIT : '0'..'9';
  198.  
  199. UNDERSCORE
  200. : '_';
  201.  
  202.  
  203.  
  204. WS : ( ' ' | '\t' | '\r' | '\n' )+ { $channel = HIDDEN; } ;
Add Comment
Please, Sign In to add comment