closer to parsing variables
This commit is contained in:
parent
081005c5fc
commit
2bab25cad9
|
|
@ -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);
|
||||
|
|
|
|||
16
lab-5/expr.h
16
lab-5/expr.h
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
;
|
||||
|
|
@ -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_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
|
||||
{$$ = 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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue