Advertisement
Guest User

Untitled

a guest
Feb 17th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.18 KB | None | 0 0
  1. %{
  2. #include <vslc.h>
  3. %}
  4. %left '+' '-'
  5. %left '*' '/'
  6. %nonassoc UMINUS
  7. %define parse.error verbose
  8. %right '~'
  9. //%expect 1
  10.  
  11. %token FUNC PRINT RETURN CONTINUE IF THEN ELSE WHILE DO OPENBLOCK CLOSEBLOCK
  12. %token VAR NUMBER IDENTIFIER STRING
  13. %token ADD SUBTRACT MULTIPLY DIVIDE EQUAL LESSTHAN GREATERTHAN ASSIGN
  14.  
  15. %%
  16. program :
  17. global_list {root = (node_t *) malloc ( sizeof(node_t) ); node_init(root, PROGRAM, NULL, 1, $1);}
  18. global_list :
  19. global {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, GLOBAL_LIST, NULL, 1, $1); $$ = temp_var;} |
  20. global_list global {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, GLOBAL_LIST, NULL, 2, $1, $2); $$ = temp_var;};
  21. global :
  22. function {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, GLOBAL, NULL, 1, $1); $$ = temp_var;} |
  23. declaration {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, GLOBAL, NULL, 1, $1); $$ = temp_var;};
  24. statement_list :
  25. statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT_LIST, NULL, 1, $1); $$ = temp_var;} |
  26. statement_list statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT_LIST, NULL, 2, $1, $2); $$ = temp_var;};
  27. print_list :
  28. print_item {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PRINT_LIST, NULL, 1, $1); $$ = temp_var;} |
  29. print_list ',' print_item {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PRINT_LIST, NULL, 2, $1, $3); $$ = temp_var;};
  30. expression_list :
  31. expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION_LIST, NULL, 1, $1); $$ = temp_var;}|
  32. expression_list ',' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION_LIST, NULL, 2, $1, $3); $$ = temp_var;};
  33. variable_list :
  34. identifier {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, VARIABLE_LIST, NULL, 1, $1); $$ = temp_var;}|
  35. variable_list ',' identifier {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, VARIABLE_LIST, NULL, 1, $1, $2, $3); $$ = temp_var;};
  36. argument_list :
  37. expression_list {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, ARGUMENT_LIST, NULL, 1, $1); $$ = temp_var;}|
  38. {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, ARGUMENT_LIST, NULL, 0); $$ = temp_var;};
  39. parameter_list :
  40. variable_list {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PARAMETER_LIST, NULL, 1, $1); $$ = temp_var;}|
  41. {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PARAMETER_LIST, NULL, 0); $$ = temp_var;};
  42. declaration_list :
  43. declaration {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, DECLARATION_LIST, NULL, 1, $1); $$ = temp_var;} |
  44. declaration_list declaration {node_t *temp_var = malloc(sizeof(node_t)); node_init( temp_var, DECLARATION_LIST, NULL, 2, $1, $2); $$ = temp_var;};
  45. function :
  46. FUNC identifier '(' parameter_list ')' statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, FUNCTION, NULL, 3, $2, $4, $6); $$ = temp_var;};
  47. statement :
  48. assignment_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;}|
  49. return_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;};
  50. statement :
  51. print_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;}|
  52. if_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;};
  53. statement :
  54. while_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;}|
  55. null_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;}|
  56. block {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;};
  57. block :
  58. OPENBLOCK declaration_list statement_list CLOSEBLOCK {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, VARIABLE_LIST, NULL, 2, $2, $3); $$ = temp_var;}|
  59. OPENBLOCK statement_list CLOSEBLOCK {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, BLOCK, NULL, 1, $2); $$ = temp_var;};
  60. assignment_statement :
  61. identifier ':' '=' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, ASSIGNMENT_STATEMENT, NULL, 4, $1, $2, $3, $4); $$ = temp_var;};
  62. return_statement :
  63. RETURN expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, RETURN_STATEMENT, NULL, 2, $1, $2); $$ = temp_var;};
  64. print_statement :
  65. PRINT print_list {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PRINT_STATEMENT, NULL, 1, $2); $$ = temp_var;};
  66. null_statement :
  67. CONTINUE {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, NULL_STATEMENT, NULL, 0); $$ = temp_var;};
  68. if_statement :
  69. IF relation THEN statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, IF_STATEMENT, NULL, 2, $2, $4); $$ = temp_var;}|
  70. IF relation THEN statement ELSE statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, IF_STATEMENT, NULL, 3, $2, $4, $6); $$ = temp_var;};
  71. while_statement :
  72. WHILE relation DO statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, WHILE_STATEMENT, NULL, 2, $2, $4); $$ = temp_var;};
  73. relation :
  74. expression '=' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, RELATION, '=', 2, $1, $3); $$ = temp_var;}|
  75. expression '<' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, RELATION, '<', 2, $1, $3); $$ = temp_var;}|
  76. expression '>' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, RELATION, '>', 2, $1, $3); $$ = temp_var;};
  77. expression :
  78. expression '+' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '+', 2, $1, $3); $$ = temp_var;}|
  79. expression '-' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '-', 2, $1, $3); $$ = temp_var;}|
  80. expression '*' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '*', 2, $1, $3); $$ = temp_var;}|
  81. expression '/' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '/', 2, $1, $3); $$ = temp_var;}|
  82. '-' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '-', 1, $2); $$ = temp_var;}|
  83. '~' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '~', 1, $2); $$ = temp_var;}|
  84. '(' expression ')' {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, NULL, 1, $2); $$ = temp_var;};
  85. expression :
  86. number {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, NULL, 1, $1); $$ = temp_var;}|
  87. identifier {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, NULL, 1, $1); $$ = temp_var;}|
  88. identifier '(' argument_list ')' {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, NULL, 2, $1, $3); $$ = temp_var;};
  89. declaration :
  90. VAR variable_list {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, DECLARATION, NULL, 1, $2); $$ = temp_var;};
  91. print_item :
  92. expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PRINT_ITEM, NULL, 1, $1); $$ = temp_var;}|
  93. string {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PRINT_ITEM, NULL, 1, $1); $$ = temp_var;};
  94. identifier :
  95. IDENTIFIER {
  96. char* data = (void*) strdup(yytext);
  97. node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, IDENTIFIER, data, 1, $1);
  98. ; $$ = temp_var;};
  99.  
  100. number :
  101. NUMBER {
  102. int64_t *data = malloc(sizeof(int64_t));
  103. *data = strtol(yytext, NULL, 10);
  104. node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, NUMBER, data, 1, $1);
  105. ; $$ = temp_var;};
  106.  
  107. string :
  108. STRING {
  109. char* data = (void*) strdup(yytext);
  110. node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STRING, data, 1, $1);
  111. ; $$ = temp_var;};
  112.  
  113.  
  114. %%
  115.  
  116. int
  117. yyerror ( const char *error )
  118. {
  119. fprintf ( stderr, "%s on line %d\n", error, yylineno );
  120. exit ( EXIT_FAILURE );
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement