Advertisement
Guest User

yac

a guest
Jan 18th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. %{
  2. #include <stdio.h>
  3. extern FILE* yyin;
  4. extern char* yytext;
  5. extern int yylineno;
  6. %}
  7. %token IMPORT DECL IMPL TYPE START_INSTR END_INSTR END_PROGRAM FUNCTION PROCEDURE DATA_STRUCTURE IF ELSE WHILE FOR UNTIL ARRAY STRUCT CLASS_SPECIFIER MATH_OP BOOL_OP CMP_OP ASSIGN NR ID CHR RETURNED CONST NOT_BOOL_OP CREATE
  8. %start progr
  9. %%
  10.  
  11. /* Structura programului */
  12. progr : using DECL declarations IMPL block { printf("\nSucces!\nProgram corect sintactic!\n"); }
  13. ;
  14.  
  15. /* importari de biblioteci */
  16. using: IMPORT
  17. | using IMPORT
  18. ;
  19.  
  20. /* Declaratii: clase, variabile, metode */
  21. declarations : declaration
  22. | declarations declaration
  23. ;
  24.  
  25. /* Tipuri de declaratii */
  26. declaration: methods
  27. | variables ';'
  28. | aclass
  29. | definedtype
  30. | constants ';'
  31. ;
  32.  
  33. /* Structura clasei */
  34. aclass : DATA_STRUCTURE STRUCT ASSIGN ID START_INSTR classdeclarations END_INSTR
  35. ;
  36.  
  37. /* Tipuri definite de utilizator */
  38. definedtype : DATA_STRUCTURE ID ASSIGN ID START_INSTR declarations END_INSTR
  39. ;
  40.  
  41. /* Declaratiile membrilor clasei */
  42. classdeclarations : classdeclaration
  43. | classdeclarations classdeclaration
  44. ;
  45.  
  46. /* Membrii clasei si specificatori */
  47. classdeclaration: methods
  48. | variables ';'
  49. | aclass
  50. | CLASS_SPECIFIER
  51. | constants ';'
  52. ;
  53.  
  54. /* Metode */
  55. methods: TYPE ':' FUNCTION ID '(' variables ')' ';'
  56. | PROCEDURE ID '(' variables ')' ';'
  57. ;
  58.  
  59. /* Variabile */
  60. variables: TYPE ':' more_ids
  61. | ARRAY TYPE ':' more_ids
  62. ;
  63.  
  64. /* Parametrii si declaratii multiple */
  65. more_ids: ID ',' more_ids
  66. | ID
  67. ;
  68.  
  69. /* Constante */
  70. constants: CONST ID TYPE '=' CHR
  71. | CONST ID TYPE '=' NR
  72. ;
  73.  
  74. /* Main Program
  75. IMPLEMENTATION */
  76. block : TYPE ':' FUNCTION ID '(' variables ')' START_INSTR list RETURNED ASSIGN expression ';' END_PROGRAM block
  77. | PROCEDURE ID '(' variables ')' START_INSTR list END_PROGRAM block
  78. | TYPE ':' FUNCTION ID '(' variables ')' START_INSTR list RETURNED ASSIGN expression ';' END_PROGRAM
  79. | PROCEDURE ID '(' variables ')' START_INSTR list END_PROGRAM
  80. ;
  81.  
  82. /* Lista de instructiuni */
  83. list : statements
  84. | list statements
  85. | ' '
  86. ;
  87.  
  88. /* o singura linie de instructiune */
  89. statements: ID ASSIGN expression ';'
  90. | ID '(' funct_param ')' ';'
  91. | ID ASSIGN CHR ';'
  92. | control_instr
  93. | classop ';'
  94. ;
  95.  
  96. classop: ID '.' CREATE '(' funct_param ')'
  97. | ID '.' CREATE
  98. | ID '.' statements
  99. | ID '.' ID
  100. ;
  101.  
  102. /* loops si declaratii conditionale */
  103. control_instr : IF conditions START_INSTR list END_INSTR ELSE START_INSTR list END_INSTR
  104. | IF conditions START_INSTR list END_INSTR
  105. | FOR ID ASSIGN tkn UNTIL tkn START_INSTR list END_INSTR
  106. | WHILE conditions START_INSTR list END_INSTR
  107. ;
  108.  
  109. /* Tokens -pentru loop */
  110. tkn : ID
  111. | NR
  112. ;
  113.  
  114.  
  115. conditions: condition BOOL_OP conditions
  116. | condition
  117. ;
  118.  
  119. condition : NR
  120. | ID
  121. | ID '(' funct_param ')'
  122. | ID CMP_OP condition
  123. | NR CMP_OP condition
  124. ;
  125.  
  126. operator : MATH_OP
  127. | BOOL_OP
  128. | CMP_OP
  129. ;
  130.  
  131. expression : ID
  132. | NR
  133. | ID operator expression
  134. | NR operator expression
  135. | ID '(' funct_param ')' operator expression
  136. | ID '(' funct_param ')'
  137. ;
  138.  
  139. funct_param : expression
  140. | funct_param ',' expression
  141. | CHR
  142. | funct_param ',' CHR
  143. ;
  144.  
  145.  
  146.  
  147. %%
  148. int yyerror(char * s){
  149. printf("Line %d. ERROR: %s \n",yylineno,s);
  150. }
  151.  
  152. int main(int argc, char** argv){
  153. yyin=fopen(argv[1],"r");
  154. yyparse();
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement