Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- #include <vslc.h>
- %}
- %left '+' '-'
- %left '*' '/'
- %nonassoc UMINUS
- %define parse.error verbose
- %right '~'
- //%expect 1
- %token FUNC PRINT RETURN CONTINUE IF THEN ELSE WHILE DO OPENBLOCK CLOSEBLOCK
- %token VAR NUMBER IDENTIFIER STRING
- %token ADD SUBTRACT MULTIPLY DIVIDE EQUAL LESSTHAN GREATERTHAN ASSIGN
- %%
- program :
- global_list {root = (node_t *) malloc ( sizeof(node_t) ); node_init(root, PROGRAM, NULL, 1, $1);}
- global_list :
- global {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, GLOBAL_LIST, NULL, 1, $1); $$ = temp_var;} |
- global_list global {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, GLOBAL_LIST, NULL, 2, $1, $2); $$ = temp_var;};
- global :
- function {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, GLOBAL, NULL, 1, $1); $$ = temp_var;} |
- declaration {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, GLOBAL, NULL, 1, $1); $$ = temp_var;};
- statement_list :
- statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT_LIST, NULL, 1, $1); $$ = temp_var;} |
- statement_list statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT_LIST, NULL, 2, $1, $2); $$ = temp_var;};
- print_list :
- print_item {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PRINT_LIST, NULL, 1, $1); $$ = temp_var;} |
- print_list ',' print_item {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PRINT_LIST, NULL, 2, $1, $3); $$ = temp_var;};
- expression_list :
- expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION_LIST, NULL, 1, $1); $$ = temp_var;}|
- expression_list ',' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION_LIST, NULL, 2, $1, $3); $$ = temp_var;};
- variable_list :
- identifier {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, VARIABLE_LIST, NULL, 1, $1); $$ = temp_var;}|
- variable_list ',' identifier {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, VARIABLE_LIST, NULL, 1, $1, $2, $3); $$ = temp_var;};
- argument_list :
- expression_list {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, ARGUMENT_LIST, NULL, 1, $1); $$ = temp_var;}|
- {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, ARGUMENT_LIST, NULL, 0); $$ = temp_var;};
- parameter_list :
- variable_list {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PARAMETER_LIST, NULL, 1, $1); $$ = temp_var;}|
- {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PARAMETER_LIST, NULL, 0); $$ = temp_var;};
- declaration_list :
- declaration {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, DECLARATION_LIST, NULL, 1, $1); $$ = temp_var;} |
- declaration_list declaration {node_t *temp_var = malloc(sizeof(node_t)); node_init( temp_var, DECLARATION_LIST, NULL, 2, $1, $2); $$ = temp_var;};
- function :
- 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;};
- statement :
- assignment_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;}|
- return_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;};
- statement :
- print_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;}|
- if_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;};
- statement :
- while_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;}|
- null_statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;}|
- block {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STATEMENT, NULL, 1, $1); $$ = temp_var;};
- block :
- 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;}|
- OPENBLOCK statement_list CLOSEBLOCK {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, BLOCK, NULL, 1, $2); $$ = temp_var;};
- assignment_statement :
- identifier ':' '=' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, ASSIGNMENT_STATEMENT, NULL, 4, $1, $2, $3, $4); $$ = temp_var;};
- return_statement :
- RETURN expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, RETURN_STATEMENT, NULL, 2, $1, $2); $$ = temp_var;};
- print_statement :
- PRINT print_list {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PRINT_STATEMENT, NULL, 1, $2); $$ = temp_var;};
- null_statement :
- CONTINUE {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, NULL_STATEMENT, NULL, 0); $$ = temp_var;};
- if_statement :
- IF relation THEN statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, IF_STATEMENT, NULL, 2, $2, $4); $$ = temp_var;}|
- 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;};
- while_statement :
- WHILE relation DO statement {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, WHILE_STATEMENT, NULL, 2, $2, $4); $$ = temp_var;};
- relation :
- expression '=' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, RELATION, '=', 2, $1, $3); $$ = temp_var;}|
- expression '<' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, RELATION, '<', 2, $1, $3); $$ = temp_var;}|
- expression '>' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, RELATION, '>', 2, $1, $3); $$ = temp_var;};
- expression :
- expression '+' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '+', 2, $1, $3); $$ = temp_var;}|
- expression '-' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '-', 2, $1, $3); $$ = temp_var;}|
- expression '*' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '*', 2, $1, $3); $$ = temp_var;}|
- expression '/' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '/', 2, $1, $3); $$ = temp_var;}|
- '-' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '-', 1, $2); $$ = temp_var;}|
- '~' expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, '~', 1, $2); $$ = temp_var;}|
- '(' expression ')' {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, NULL, 1, $2); $$ = temp_var;};
- expression :
- number {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, NULL, 1, $1); $$ = temp_var;}|
- identifier {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, NULL, 1, $1); $$ = temp_var;}|
- identifier '(' argument_list ')' {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, EXPRESSION, NULL, 2, $1, $3); $$ = temp_var;};
- declaration :
- VAR variable_list {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, DECLARATION, NULL, 1, $2); $$ = temp_var;};
- print_item :
- expression {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PRINT_ITEM, NULL, 1, $1); $$ = temp_var;}|
- string {node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, PRINT_ITEM, NULL, 1, $1); $$ = temp_var;};
- identifier :
- IDENTIFIER {
- char* data = (void*) strdup(yytext);
- node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, IDENTIFIER, data, 1, $1);
- ; $$ = temp_var;};
- number :
- NUMBER {
- int64_t *data = malloc(sizeof(int64_t));
- *data = strtol(yytext, NULL, 10);
- node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, NUMBER, data, 1, $1);
- ; $$ = temp_var;};
- string :
- STRING {
- char* data = (void*) strdup(yytext);
- node_t *temp_var = malloc(sizeof(node_t)); node_init(temp_var, STRING, data, 1, $1);
- ; $$ = temp_var;};
- %%
- int
- yyerror ( const char *error )
- {
- fprintf ( stderr, "%s on line %d\n", error, yylineno );
- exit ( EXIT_FAILURE );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement