WhaleSpunk

Untitled

Mar 29th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.71 KB | None | 0 0
  1. %{
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #define DEBUG 0
  7.  
  8. typedef struct AST_Tree{
  9. char type[60];
  10. struct AST_Tree* child;
  11. struct AST_Tree* brother;
  12. char *value;
  13. }AST_Tree_node;
  14.  
  15.  
  16. AST_Tree_node *head = NULL;
  17.  
  18. AST_Tree_node* insertNode(char* node);
  19. AST_Tree_node* insert_value_node(char* node, char* value);
  20. void insert_child(AST_Tree_node* father, AST_Tree_node* child);
  21. void insert_brother(AST_Tree_node* brother, AST_Tree_node* node)
  22. int flag=0;
  23. int aux2 = 0;
  24. int imprimir=0;
  25. int parse=0;
  26. int yylex(void);
  27. void yyerror(const char *s);
  28.  
  29. extern int n_linha;
  30. extern int n_coluna;
  31. extern char * yytext;
  32. extern int yyleng;
  33. AST_Tree_node *nodeAux;
  34. AST_Tree_node *nodeAux2;
  35.  
  36.  
  37.  
  38. %}
  39.  
  40. %union{
  41. char *str;
  42. struct AST_Tree *node;
  43. }
  44.  
  45. %token <str> ID STRLIT BOOLLIT DECLIT REALLIT
  46.  
  47. %token PUBLIC BOOL INT DOUBLE SEMI COMMA PARSEINT OCURV OSQUARE CSQUARE CCURV ASSIGN AND OR EQ GEQ GT LEQ LT NEQ PLUS MINUS STAR DIV MOD NOT DOTLENGTH STATIC STRING VOID CLASS OBRACE CBRACE IF ELSE WHILE DO PRINT RETURN RESERVED
  48.  
  49.  
  50.  
  51. %left COMMA
  52. %right ASSIGN
  53. %left OR
  54. %left AND
  55. %left EQ NEQ
  56. %left LT GT LEQ GEQ
  57. %left MINUS PLUS
  58. %left STAR DIV MOD
  59. %right NOT
  60. %left OCURV OBRACE OSQUARE CCURV CBRACE CSQUARE
  61.  
  62. %nonassoc ELSE
  63.  
  64. %%
  65.  
  66.  
  67.  
  68. Program: CLASS ID OBRACE FieldDecl_MethodDecl_SEMI CBRACE {if(flag == 0){$$ = head = insertNode("Program");nodeAux = insert_value_node("ID", $2); insert_child($$, nodeAux); insert_child($$, $4);}}
  69. | CLASS ID OBRACE CBRACE {if(flag==0){$$ = head = insertNode("Program");nodeAux = insert_value_node("ID", $2);insert_child($$, nodeAux);}}
  70. ;
  71.  
  72. FieldDecl_MethodDecl_SEMI: FieldDecl_MethodDecl_SEMI FieldDecl {if(flag ==0){insert_child(head, $2);}}
  73. | FieldDecl_MethodDecl_SEMI MethodDecl {if(flag == 0){insert_child(head, $2);}}
  74. | FieldDecl_MethodDecl_SEMI SEMI {;}
  75. | FieldDecl {if(flag ==0 ){insert_child(head, $1);}}
  76. | MethodDecl {if(flag == 0){insert_child(head, $1);}}
  77. | SEMI {;}
  78. ;
  79.  
  80.  
  81. FieldDecl: PUBLIC STATIC Type ID CommaID SEMI {if(flag ==0){$$ = insertNode("FieldDecl"); insert_child($$, $3); nodeAux = insert_value_node("ID", $4);insert_child($$, nodeAux); insert_child($$, $5); }}
  82. | PUBLIC STATIC Type ID SEMI {if(flag == 0){$$ = insertNode("FieldDecl"); insert_child($$, $3); nodeAux = insert_value_node("ID", $4); insert_child($$, nodeAux);}}
  83. | error SEMI {if(flag == 0){$$ = NULL;}}
  84. ;
  85.  
  86. CommaID: CommaID COMMA ID {if(flag == 0){$$ = $1 ; nodeAux = insert_value_node("ID", $3); insert_brother($$, nodeAux);}}
  87. | COMMA ID {if(flag == 0){insert_value_node("ID", $2);}}
  88. ;
  89.  
  90. MethodDecl: PUBLIC STATIC MethodHeader MethodBody {if(DEBUG){printf("MethodDecl\n");}}
  91. ;
  92.  
  93. MethodHeader: Type ID OCURV FormalParams CCURV {if(DEBUG){printf("MethodHeader_Type_ID_OCURV_FPO_CCURV\n");}}
  94. | Type ID OCURV CCURV
  95. | VOID ID OCURV FormalParams CCURV {if(DEBUG){printf("MethodHeader_VOID_ID_OCURV_FPO_CCURV\n");}}
  96. | VOID ID OCURV CCURV
  97. ;
  98.  
  99. FormalParams: Type ID CommaTypeID {if(DEBUG){printf("FormalParams_Type_ID\n");}}
  100. | Type ID {if(DEBUG){printf("FormalParams_Type_ID\n");}}
  101. | STRING OSQUARE CSQUARE ID {if(DEBUG){printf("FormalParams_STRING_OSQUARE_CSQUARE_ID\n");}}
  102. ;
  103.  
  104.  
  105. CommaTypeID: COMMA Type ID {if(DEBUG){printf("CommaTypeID\n");}}
  106. | CommaTypeID COMMA Type ID {if(DEBUG){printf("CommaTypeID\n");}}
  107. ;
  108.  
  109.  
  110. MethodBody: OBRACE VarDecl_Statement CBRACE {if(DEBUG){printf("MethodBody\n");}}
  111. | OBRACE CBRACE {if(DEBUG){printf("MethodBody\n");}}
  112. ;
  113.  
  114.  
  115. VarDecl_Statement: VarDecl {if(DEBUG){printf("Statement_VarDecl_Statement\n");}}
  116. | Statement {if(DEBUG){printf("VarDecl_VarDecl_Statement\n");}}
  117. | VarDecl_Statement VarDecl {if(DEBUG){printf("VarDecl_VarDecl_Statement\n");}}
  118. | VarDecl_Statement Statement {if(DEBUG){printf("Statement_VarDecl_Statement\n");}}
  119. ;
  120.  
  121.  
  122.  
  123. VarDecl: Type ID CommaID SEMI {if(DEBUG){printf("VarDecl\n");}}
  124. | Type ID SEMI {if(DEBUG){printf("VarDecl\n");}}
  125. ;
  126.  
  127. Type: BOOL {if(DEBUG){printf("BOOL\n");}}
  128. | INT {if(DEBUG){printf("INT\n");}}
  129. | DOUBLE {if(DEBUG){printf("DOUBLE\n");}}
  130. ;
  131.  
  132. Statement: OBRACE Statement_aux CBRACE {if(DEBUG){printf("OBRACE_St_CBRACE\n");}}
  133. | OBRACE CBRACE {if(DEBUG){printf("OBRACE_CBRACE\n");}}
  134. | IF OCURV Expr CCURV Statement {if(DEBUG){printf("IF_OCURV_Expr_CCURV_Statement\n");}}
  135. | IF OCURV Expr CCURV Statement ELSE Statement {if(DEBUG){printf("IF_OCURV_Expr_CCURV_Statement_Else_Statement\n");}}
  136. | WHILE OCURV Expr CCURV Statement {if(DEBUG){printf("WHILE_OCURV_Expr_CCURV_Statement\n");}}
  137. | DO Statement WHILE OCURV Expr CCURV SEMI {if(DEBUG){printf("DO_Statement_WHILE_OCURV_Expr_CCURV_SEMI\n");}}
  138. | PRINT OCURV Expr CCURV SEMI {if(DEBUG){printf("PRINT_OCURV_Expr_CCURV_SEMI\n");}}
  139. | PRINT OCURV STRLIT CCURV SEMI {if(DEBUG){printf("PRINT_OCURV_STRLIT_CCURV_SEMI\n");}}
  140. | SEMI {if(DEBUG){printf("SEMI\n");}}
  141. | Assignment SEMI {if(DEBUG){printf("Assignment SEMI\n");}}
  142. | MethodInvocation SEMI {if(DEBUG){printf("MethodInvocation SEMI\n");}}
  143. | ParseArgs SEMI {if(DEBUG){printf("ParseArgs SEMI\n");}}
  144. | RETURN SEMI {if(DEBUG){printf("RETURN_ExpressionOptional_SEMI\n");}}
  145. | RETURN Expr SEMI {if(DEBUG){printf("RETURN_ExpressionOptional_SEMI\n");}}
  146. | error SEMI {if(DEBUG){printf("Error SEMI on Statement\n");}}
  147. ;
  148.  
  149.  
  150.  
  151. Statement_aux: Statement {if(DEBUG){printf("Statement\n");}}
  152. | Statement_aux Statement {if(DEBUG){printf("Statementaux Statement_aux\n");}}
  153. ;
  154.  
  155. Expr: ExprNew
  156. | Assignment
  157. ;
  158.  
  159. ExprNew: MethodInvocation {if(DEBUG){printf("Expression1_MethodInvocation\n");}}
  160. | ParseArgs {if(DEBUG){printf("Expression1_ParseArgs\n");}}
  161. | ExprNew AND ExprNew {if(DEBUG){printf("Expr_AND_Expr\n");}}
  162. | ExprNew OR ExprNew {if(DEBUG){printf("Expr_OR_Expr\n");}}
  163. | ExprNew EQ ExprNew {if(DEBUG){printf("Expr_EQ_Expr\n");}}
  164. | ExprNew GEQ ExprNew {if(DEBUG){printf("Expr_GEQ_Expr\n");}}
  165. | ExprNew GT ExprNew {if(DEBUG){printf("Expr_GT_Expr\n");}}
  166. | ExprNew LEQ ExprNew {if(DEBUG){printf("Expr_LEQ_Expr\n");}}
  167. | ExprNew LT ExprNew {if(DEBUG){printf("Expr_LT_Expr\n");}}
  168. | ExprNew NEQ ExprNew {if(DEBUG){printf("Expr_NEQ_Expr\n");}}
  169. | ExprNew PLUS ExprNew {if(DEBUG){printf("Expr_PLUS_Expr\n");}}
  170. | ExprNew MINUS ExprNew {if(DEBUG){printf("Expr_MINUS_Expr\n");}}
  171. | ExprNew STAR ExprNew {if(DEBUG){printf("Expr_STAR_Expr\n");}}
  172. | ExprNew DIV ExprNew {if(DEBUG){printf("Expr_DIV_Expr\n");}}
  173. | ExprNew MOD ExprNew {if(DEBUG){printf("Expr_MOD_Expr\n");}}
  174. | PLUS ExprNew %prec NOT {if(DEBUG){printf("PLUS_Expr\n");}}
  175. | MINUS ExprNew %prec NOT {if(DEBUG){printf("MINUS_Expr\n");}}
  176. | NOT ExprNew {if(DEBUG){printf("NOT_Expr\n");}}
  177. | ID DOTLENGTH {if(DEBUG){printf("ID_Dotlength\n");}}
  178. | ID {if(DEBUG){printf("ID ExprNew\n");}}
  179. | OCURV Expr CCURV {if(DEBUG){printf("OCURV_Expr_CCURV\n");}}
  180. | BOOLLIT {if(DEBUG){printf("BOOLLIT\n");}}
  181. | DECLIT {if(DEBUG){printf("DECLIT\n");}}
  182. | REALLIT {if(DEBUG){printf("REALLIT\n");}}
  183. | OCURV error CCURV {if(DEBUG){printf("Error OCURV CCURV on Expr\n");}}
  184. ;
  185.  
  186. Assignment: ID ASSIGN Expr {if(DEBUG){printf("Assigment\n");}}
  187. ;
  188.  
  189.  
  190. MethodInvocation: ID OCURV CCURV {if(DEBUG){printf("MethodInvocation\n");}}
  191. | ID OCURV Expr CCURV {if(DEBUG){printf("MethodInvocation\n");}}
  192. | ID OCURV Expr CommaExpr CCURV {if(DEBUG){printf("MethodInvocation\n");}}
  193. | ID OCURV error CCURV {if(DEBUG){printf("Error ID OCURV CCURV on MethodInvocation\n");}}
  194. ;
  195.  
  196. CommaExpr: COMMA Expr {if(DEBUG){printf("CommaExpr\n");}}
  197. | CommaExpr COMMA Expr {if(DEBUG){printf("CommaExpr\n");}}
  198. ;
  199.  
  200. ParseArgs: PARSEINT OCURV ID OSQUARE Expr CSQUARE CCURV {if(DEBUG){printf("ParseArgs\n");}}
  201. | PARSEINT OCURV error CCURV {if(DEBUG){printf("Error PARSEINT OCURV CCURV on ParseArgs\n");}}
  202. ;
  203.  
  204.  
  205.  
  206. %%
  207.  
  208. void yyerror(const char* s){
  209. if(flag ==0){
  210. flag = 1;
  211. }
  212. printf("Line %d, col %d: %s: %s\n",n_linha,(int)(n_coluna - strlen(yytext)),s,yytext);
  213. }
  214.  
  215.  
  216.  
  217. void insert_brother(AST_Tree_node* brother, AST_Tree_node* node)
  218. {
  219.  
  220.  
  221. AST_Tree_node* aux = brother;
  222.  
  223. if(aux!=NULL && node!=NULL)
  224. {
  225. while(aux->brother != NULL)
  226. {
  227. aux = aux->brother;
  228. }
  229. aux->brother = node;
  230. }
  231. }
  232.  
  233.  
  234. void insert_child(AST_Tree_node* father, AST_Tree_node* child)
  235. {
  236.  
  237. AST_Tree_node* temp = father->child;
  238.  
  239. if(temp==NULL)
  240. {
  241. father->child = child;
  242. }
  243. else
  244. {
  245.  
  246. insert_brother(father->child, child);
  247. }
  248.  
  249. }
  250.  
  251.  
  252. AST_Tree_node* insert_value_node(char* node, char* value){
  253.  
  254. AST_Tree_node* new_node = insertNode(node);
  255. new_node->value = value;
  256. return new_node;
  257.  
  258. }
  259.  
  260. AST_Tree_node* insertNode(char* node){
  261. AST_Tree_node* new_node;
  262. new_node = (AST_Tree_node *)(malloc(sizeof(AST_Tree_node)));
  263. if(new_node != NULL){
  264. new_node->child = NULL;
  265. new_node->brother = NULL;
  266. new_node->value = NULL;
  267. strcpy(new_node->type, node);
  268. }
  269. return new_node;
  270. }
  271.  
  272. int main(int argc, char *argv[])
  273. {
  274. if(argc>1){
  275. if(strcmp(argv[1],"-l")==0){
  276. imprimir=1;
  277. yylex();
  278. }
  279. else if(strcmp(argv[1],"-1")==0){
  280. yylex();
  281. }
  282. }
  283. else{
  284. parse=1;
  285. yyparse();
  286. }
  287.  
  288. return 0;
  289. }
Add Comment
Please, Sign In to add comment