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

View File

@ -46,11 +46,20 @@ struct expr {
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 {
type_t kind;
struct type *subtype;
int limit;
computation_level_t level;
};
struct decl {
@ -69,7 +78,8 @@ typedef enum {
STMT_PRINT,
STMT_SECTION,
STMT_COMPUTE,
STMT_MOVE
STMT_MOVE,
STMT_END_EXECUTION,
} stmt_t;
struct stmt {
@ -104,6 +114,8 @@ void stmt_print(struct stmt *e);
void decl_print(struct decl *d);
void expr_print(struct expr *e);
void ast_print(struct stmt *e);
void stmt_evaluate(struct stmt *e);
void decl_evaluate(struct decl *e);
void stmt_evaluate_print(struct expr *e);

View File

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