closer to parsing variables

This commit is contained in:
vel 2024-11-14 15:59:57 -08:00
parent 081005c5fc
commit 2bab25cad9
Signed by: velvox
GPG Key ID: 59D9762F674151DF
3 changed files with 58 additions and 22 deletions

View File

@ -153,6 +153,9 @@ void stmt_print(struct stmt *s) {
case STMT_SECTION: case STMT_SECTION:
printf("section\n"); printf("section\n");
break; break;
case STMT_END_EXECUTION:
printf("stop run\n");
break;
} }
stmt_print(s->next); stmt_print(s->next);
@ -271,6 +274,8 @@ void stmt_evaluate(struct stmt *s) {
break; break;
case STMT_SECTION: case STMT_SECTION:
break; break;
case STMT_END_EXECUTION:
break;
} }
stmt_evaluate(s->next); stmt_evaluate(s->next);

View File

@ -46,11 +46,20 @@ struct expr {
const char *string_literal; const char *string_literal;
}; };
typedef enum { TYPE_ARRAY, TYPE_FLOAT, TYPE_INTEGER, TYPE_STRING } type_t; typedef enum {
TYPE_ALPHANUMERIC,
TYPE_IMPLIED_DECIMAL,
TYPE_NUMERIC,
TYPE_SIGNED_NUMERIC
} type_t;
typedef enum { LEVEL_0, LEVEL_1, LEVEL_2, LEVEL_3 } computation_level_t;
struct type { struct type {
type_t kind; type_t kind;
struct type *subtype; struct type *subtype;
int limit;
computation_level_t level;
}; };
struct decl { struct decl {
@ -69,7 +78,8 @@ typedef enum {
STMT_PRINT, STMT_PRINT,
STMT_SECTION, STMT_SECTION,
STMT_COMPUTE, STMT_COMPUTE,
STMT_MOVE STMT_MOVE,
STMT_END_EXECUTION,
} stmt_t; } stmt_t;
struct stmt { struct stmt {
@ -104,6 +114,8 @@ void stmt_print(struct stmt *e);
void decl_print(struct decl *d); void decl_print(struct decl *d);
void expr_print(struct expr *e); void expr_print(struct expr *e);
void ast_print(struct stmt *e);
void stmt_evaluate(struct stmt *e); void stmt_evaluate(struct stmt *e);
void decl_evaluate(struct decl *e); void decl_evaluate(struct decl *e);
void stmt_evaluate_print(struct expr *e); void stmt_evaluate_print(struct expr *e);

View File

@ -92,12 +92,13 @@ struct stmt *parser_result = 0;
struct expr *expr; struct expr *expr;
struct stmt *stmt; struct stmt *stmt;
struct decl *decl; struct decl *decl;
struct type *type;
} }
%type <stmt> statement_list statement section stop_run sect_data simple_stmt data_declaration cbl_func_stmt cbl_function %type <stmt> statement_list statement section stop_run sect_data simple_stmt cbl_func_stmt cbl_function
%type <expr> mathmaticalexpr booleanexpr term op_parm container_expr type_expr op_parms math_op %type <expr> mathmaticalexpr booleanexpr term op_parm container_expr type_expr op_parms math_op categry_contain category_value
%type <decl> assignment_stmt %type <decl> assignment_stmt simple_decl complex_decl data_declaration
%type <type> data_category complete_category category_spec data_clause
%% %%
file : statement_list file : statement_list
{parser_result = $1; return 0;} {parser_result = $1; return 0;}
@ -116,7 +117,7 @@ statement : section
| data_space | data_space
{$$ = stmt_create(STMT_SECTION, NULL, NULL, NULL, NULL, NULL, NULL, NULL);} {$$ = stmt_create(STMT_SECTION, NULL, NULL, NULL, NULL, NULL, NULL, NULL);}
| data_declaration | data_declaration
{$$ = stmt_create(STMT_BLOCK, NULL, NULL, NULL, NULL, $1, NULL, NULL);} {$$ = stmt_create(STMT_DECL, $1, NULL, NULL, NULL, NULL, NULL, NULL);}
| stop_run | stop_run
{$$ = $1;} {$$ = $1;}
; ;
@ -124,7 +125,7 @@ section : type TOKEN_KEYWORD_DIVISION TOKEN_DOT
{$$ = stmt_create(STMT_SECTION, NULL, NULL, NULL, NULL, NULL, NULL, NULL);} {$$ = stmt_create(STMT_SECTION, NULL, NULL, NULL, NULL, NULL, NULL, NULL);}
; ;
stop_run : TOKEN_STOP TOKEN_RUN TOKEN_DOT stop_run : TOKEN_STOP TOKEN_RUN TOKEN_DOT
{$$ = stmt_create(STMT_SECTION, NULL, NULL, NULL, NULL, NULL, NULL, NULL);} {$$ = stmt_create(STMT_END_EXECUTION, NULL, NULL, NULL, NULL, NULL, NULL, NULL);}
; ;
sect_data : TOKEN_PROGRAM_ID TOKEN_DOT TOKEN_IDENT TOKEN_DOT sect_data : TOKEN_PROGRAM_ID TOKEN_DOT TOKEN_IDENT TOKEN_DOT
{$$ = stmt_create(STMT_SECTION, NULL, NULL, NULL, NULL, NULL, NULL, NULL);} {$$ = stmt_create(STMT_SECTION, NULL, NULL, NULL, NULL, NULL, NULL, NULL);}
@ -139,12 +140,12 @@ simple_stmt : cbl_func_stmt
| else_parts | else_parts
| perform_stmt | perform_stmt
; ;
cbl_func_stmt : cbl_function cbl_func_stmt : cbl_function op_parms
| cbl_function op_parms
{$$ = stmt_create($1->kind, NULL, NULL, $2, NULL, NULL, NULL, NULL);} {$$ = stmt_create($1->kind, NULL, NULL, $2, NULL, NULL, NULL, NULL);}
| cbl_function assignment_stmt | cbl_function assignment_stmt
{$$ = stmt_create($1->kind, NULL, NULL, NULL, NULL, $2, NULL, NULL);} {$$ = stmt_create($1->kind, NULL, NULL, NULL, NULL, $2, NULL, NULL);}
| cbl_function op_parm assignment_stmt | cbl_function op_parm assignment_stmt
{$$ = stmt_create($1->kind, NULL, NULL, $2, NULL, $3, NULL, NULL);}
; ;
assignment_stmt : TOKEN_EQUAL op_parms assignment_stmt : TOKEN_EQUAL op_parms
{$$ = decl_create(NULL, NULL, $2, NULL, NULL);} {$$ = decl_create(NULL, NULL, $2, NULL, NULL);}
@ -185,6 +186,7 @@ mathmaticalexpr : type_expr
{$$ = $1; $1->right = $2;} {$$ = $1; $1->right = $2;}
; ;
container_expr : TOKEN_LEFT_PARENTHESIS mathmaticalexpr TOKEN_RIGHT_PARENTHESIS container_expr : TOKEN_LEFT_PARENTHESIS mathmaticalexpr TOKEN_RIGHT_PARENTHESIS
{$$ = $2;}
; ;
booleanexpr : mathmaticalexpr TOKEN_LESS_THAN term booleanexpr : mathmaticalexpr TOKEN_LESS_THAN term
{$$ = expr_create(EXPR_LESS_THAN, $1, $3);} {$$ = expr_create(EXPR_LESS_THAN, $1, $3);}
@ -201,6 +203,7 @@ type_expr : TOKEN_IDENT
{$$ = expr_create_string_literal(yytext);} {$$ = expr_create_string_literal(yytext);}
| TOKEN_SPACE | TOKEN_SPACE
{$$ = expr_create_integer_literal(0);} {$$ = expr_create_integer_literal(0);}
// TODO: implment negative numbers
| TOKEN_SUB TOKEN_IDENT | TOKEN_SUB TOKEN_IDENT
| ext_function | ext_function
; ;
@ -226,38 +229,54 @@ perform_stmt : TOKEN_PERFORM TOKEN_VARYING TOKEN_IDENT TOKEN_KEYWORD_FROM TOK
data_space : TOKEN_WORKING_STORAGE TOKEN_KEYWORD_SECTION TOKEN_DOT data_space : TOKEN_WORKING_STORAGE TOKEN_KEYWORD_SECTION TOKEN_DOT
; ;
data_category : TOKEN_ALPHANUMERIC data_category : TOKEN_ALPHANUMERIC
{$$ = type_create(TYPE_ALPHANUMERIC, NULL);}
| TOKEN_NUMERIC | TOKEN_NUMERIC
{$$ = type_create(TYPE_NUMERIC, NULL);}
| TOKEN_SIGNED_NUMERIC | TOKEN_SIGNED_NUMERIC
{$$ = type_create(TYPE_SIGNED_NUMERIC, NULL);}
| TOKEN_IMPLIED_DECIMAL | TOKEN_IMPLIED_DECIMAL
{$$ = type_create(TYPE_IMPLIED_DECIMAL, NULL);}
; ;
categry_contain : TOKEN_LEFT_PARENTHESIS TOKEN_INTEGER TOKEN_RIGHT_PARENTHESIS categry_contain : TOKEN_LEFT_PARENTHESIS TOKEN_INTEGER TOKEN_RIGHT_PARENTHESIS
| TOKEN_LEFT_PARENTHESIS TOKEN_IDENT TOKEN_RIGHT_PARENTHESIS {$$ = expr_create_integer_literal(atoi(yytext));}
; ;
complete_category: data_category categry_contain complete_category: data_category categry_contain
{$$ = $1; $1->limit = $2->integer_value;}
| data_category categry_contain complete_category | data_category categry_contain complete_category
{$1->limit = $2->integer_value; $1->subtype = $3; $$ = $1;}
; ;
data_clause : TOKEN_COMPUTATION_LEVEL_0 data_clause : TOKEN_COMPUTATION_LEVEL_0
{$$ = type_create(TYPE_ALPHANUMERIC, NULL); $$->level = LEVEL_0;}
| TOKEN_COMPUTATION_LEVEL_1 | TOKEN_COMPUTATION_LEVEL_1
{$$ = type_create(TYPE_ALPHANUMERIC, NULL); $$->level = LEVEL_1;}
| TOKEN_COMPUTATION_LEVEL_2 | TOKEN_COMPUTATION_LEVEL_2
{$$ = type_create(TYPE_ALPHANUMERIC, NULL); $$->level = LEVEL_2;}
| TOKEN_COMPUTATION_LEVEL_3 | TOKEN_COMPUTATION_LEVEL_3
| TOKEN_KEYWORD_VALUE {$$ = type_create(TYPE_ALPHANUMERIC, NULL); $$->level = LEVEL_3;}
| TOKEN_KEYWORD_OCCURS |
;
full_data_clause: data_clause data_clause
| data_clause
; ;
//TODO: implement levels
simple_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_DOT simple_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_DOT
{$$ = decl_create(expr_create_name(yytext), NULL, NULL, NULL, NULL);}
; ;
complex_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_PICTURE category_spec TOKEN_DOT complex_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_PICTURE category_spec TOKEN_DOT
{$$ = decl_create(expr_create_name(yytext), $4, NULL, NULL, NULL);}
;
category_value : TOKEN_KEYWORD_VALUE TOKEN_INTEGER
{$$ = expr_create_integer_literal(atoi(yytext));}
| TOKEN_KEYWORD_OCCURS TOKEN_INTEGER
{$$ = expr_create_integer_literal(atoi(yytext));}
|
; ;
category_spec : complete_category category_spec : complete_category
| complete_category data_clauses {$$ = decl_create(NULL, $1, NULL, NULL, NULL);}
; | complete_category data_clause category_value
data_clauses : full_data_clause { $$ = decl_create(NULL, $1, NULL, NULL, $2);}
| full_data_clause TOKEN_INTEGER
; ;
data_declaration: simple_decl data_declaration: simple_decl
{$$ = $1;}
| complex_decl | complex_decl
{$$ = $1;}
; ;
%% %%
void yyerror(const char* msg) { void yyerror(const char* msg) {