daily pastebin goal
59%
SHARE
TWEET

Untitled

a guest Feb 17th, 2019 61 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top