start work on getting hello world interpreting

This commit is contained in:
vel 2024-11-13 21:22:40 -08:00
parent 74faae2743
commit 5d03635b93
Signed by: velvox
GPG Key ID: 59D9762F674151DF
3 changed files with 162 additions and 15 deletions

View File

@ -4,10 +4,15 @@ Simply invoke the parser generated by bison, and then display the output.
*/ */
#include "expr.h" #include "expr.h"
#include "token.h"
#include <stdio.h> #include <stdio.h>
/* Clunky: Declare the parse function generated from parser.bison */ /* Clunky: Declare the parse function generated from parser.bison */
extern int yyparse(struct stmt *parser_result); // extern int yyparse(struct stmt *parser_result);
extern int yyparse();
extern char *yytext;
extern int yylex();
/* Clunky: Declare the result of the parser from parser.bison */ /* Clunky: Declare the result of the parser from parser.bison */
@ -18,7 +23,8 @@ int main(int argc, char *argv[]) {
printf( printf(
"Enter an infix expression using the operators +-*/() ending with ;\n\n"); "Enter an infix expression using the operators +-*/() ending with ;\n\n");
if (yyparse(parser_result) == 0) {
if (yyparse() == 0) {
printf("Parse successful: "); printf("Parse successful: ");
if (parser_result != NULL) { if (parser_result != NULL) {
stmt_print(parser_result); stmt_print(parser_result);
@ -27,7 +33,6 @@ int main(int argc, char *argv[]) {
stmt_evaluate(parser_result); stmt_evaluate(parser_result);
printf("\n"); printf("\n");
} }
printf("parser_result is %p\n", parser_result);
return 0; return 0;
} else { } else {
printf("Parse failed!\n"); printf("Parse failed!\n");

View File

@ -19,13 +19,16 @@ Clunky: Manually declare the interface to the scanner generated by flex.
extern char *yytext; extern char *yytext;
extern int yylex(); extern int yylex();
void yyerror(struct stmt *parser_result, const char*); // void yyerror(struct stmt *parser_result, const char*);
void yyerror(const char*);
extern int yylineno; extern int yylineno;
struct stmt *parser_result = 0;
%} %}
%parse-param {struct stmt *parser_result} // %parse-param {struct stmt *parser_result}
%debug %debug
%define parse.error detailed %define parse.error detailed
@ -84,19 +87,21 @@ extern int yylineno;
%% %%
file : statements file : statement_list
statements : statement_list {parser_result = $1; return 0;}
; ;
statement_list : statement_list statement statement_list : statement_list statement
{ $$ = $1; $1->next = $2; }
| statement | statement
{ $$ = $1; }
; ;
statement : section statement : section
| sect_data | sect_data
| simple_stmt | simple_stmt
{$$ = stmt_create(STMT_BLOCK, NULL, NULL, NULL, NULL, $1, NULL, NULL);}
| data_space | data_space
| data_declaration | data_declaration
; ;
section : type TOKEN_KEYWORD_DIVISION TOKEN_DOT section : type TOKEN_KEYWORD_DIVISION TOKEN_DOT
| type TOKEN_RUN TOKEN_DOT | type TOKEN_RUN TOKEN_DOT
; ;
@ -108,12 +113,14 @@ type : TOKEN_KEYWORD_IDENTIFICATION
| TOKEN_KEYWORD_DATA | TOKEN_KEYWORD_DATA
; ;
simple_stmt : cbl_func_stmt simple_stmt : cbl_func_stmt
{$$ = $1;}
| if_branch | if_branch
| else_parts | else_parts
| perform_stmt | perform_stmt
; ;
cbl_func_stmt : cbl_function cbl_func_stmt : cbl_function
| cbl_function op_parms | cbl_function op_parms
{$$ = stmt_create($1->kind, NULL, NULL, $2, NULL, NULL, NULL, NULL);}
| cbl_function assignment_stmt | cbl_function assignment_stmt
| cbl_function op_parm assignment_stmt | cbl_function op_parm assignment_stmt
; ;
@ -121,12 +128,17 @@ assignment_stmt : TOKEN_EQUAL op_parms
| TOKEN_KEYWORD_TO op_parms | TOKEN_KEYWORD_TO op_parms
; ;
op_parms : op_parm op_parms : op_parm
| op_parms op_parm {$$ = $1;}
| op_parm op_parms
{$$ = $1; $1->next_expr = $2;}
; ;
op_parm : mathmaticalexpr op_parm : mathmaticalexpr
{$$ = $1;}
| booleanexpr | booleanexpr
{$$ = $1;}
; ;
term : mathmaticalexpr term : mathmaticalexpr
{$$ = $1;}
; ;
math_op : TOKEN_ADD math_op : TOKEN_ADD
| TOKEN_SUB | TOKEN_SUB
@ -135,9 +147,12 @@ math_op : TOKEN_ADD
| TOKEN_EXPONENTIAL | TOKEN_EXPONENTIAL
; ;
mathmaticalexpr : type_expr mathmaticalexpr : type_expr
{$$ = $1;}
| mathmaticalexpr math_op term | mathmaticalexpr math_op term
| container_expr | container_expr
{$$ = $1;}
| type_expr container_expr | type_expr container_expr
{$$ = $1; $1->next_expr = $2;}
; ;
container_expr : TOKEN_LEFT_PARENTHESIS mathmaticalexpr TOKEN_RIGHT_PARENTHESIS container_expr : TOKEN_LEFT_PARENTHESIS mathmaticalexpr TOKEN_RIGHT_PARENTHESIS
; ;
@ -146,15 +161,21 @@ booleanexpr : mathmaticalexpr TOKEN_LESS_THAN term
| mathmaticalexpr TOKEN_EQUAL term | mathmaticalexpr TOKEN_EQUAL term
; ;
type_expr : TOKEN_IDENT type_expr : TOKEN_IDENT
{$$ = expr_create_name(yytext);}
| TOKEN_INTEGER | TOKEN_INTEGER
{$$ = expr_create_integer_literal(yytext);}
| TOKEN_STRING | TOKEN_STRING
{$$ = expr_create_string_literal(atoi(yytext));}
| TOKEN_SPACE | TOKEN_SPACE
{$$ = expr_create_integer_literal(0);}
| TOKEN_SUB TOKEN_IDENT | TOKEN_SUB TOKEN_IDENT
{$$ = expr_create_integer_literal(atoi(yytext) * -1);}
| ext_function | ext_function
; ;
ext_function : TOKEN_KEYWORD_FUNCTION TOKEN_IDENT TOKEN_LEFT_PARENTHESIS TOKEN_IDENT TOKEN_RIGHT_PARENTHESIS ext_function : TOKEN_KEYWORD_FUNCTION TOKEN_IDENT TOKEN_LEFT_PARENTHESIS TOKEN_IDENT TOKEN_RIGHT_PARENTHESIS
; ;
cbl_function : TOKEN_DISPLAY cbl_function : TOKEN_DISPLAY
{$$ = stmt_create(STMT_PRINT, NULL, NULL, NULL, NULL, NULL, NULL, NULL);}
| TOKEN_MOVE | TOKEN_MOVE
| TOKEN_KEYWORD_COMPUTE | TOKEN_KEYWORD_COMPUTE
; ;
@ -204,6 +225,10 @@ data_declaration: simple_decl
| complex_decl | complex_decl
; ;
%% %%
void yyerror(struct stmt *parser_result, const char* msg) { // void yyerror(struct stmt *parser_result, const char* msg) {
// fprintf(stderr, "Error | Line: %d\n%s\n",yylineno,msg);
// }
void yyerror(const char* msg) {
fprintf(stderr, "Error | Line: %d\n%s\n",yylineno,msg); fprintf(stderr, "Error | Line: %d\n%s\n",yylineno,msg);
} }

117
lab-5/parser.bison.new Normal file
View File

@ -0,0 +1,117 @@
%{
#define YYDEBUG 1
#include <stdio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "expr.h"
/*
YYSTYPE is the lexical value returned by each rule in a bison grammar.
By default, it is an integer. In this example, we are returning a pointer to an expression.
*/
#define YYSTYPE struct stmt *
/*
Clunky: Manually declare the interface to the scanner generated by flex.
*/
extern char *yytext;
extern int yylex();
// void yyerror(struct stmt *parser_result, const char*);
void yyerror(const char*);
extern int yylineno;
struct stmt *parser_result = 0;
%}
// %parse-param {struct stmt *parser_result}
%debug
%define parse.error detailed
%token TOKEN_EOF
%token TOKEN_KEYWORD_IDENTIFICATION
%token TOKEN_KEYWORD_DIVISION
%token TOKEN_KEYWORD_DATA
%token TOKEN_KEYWORD_SECTION
%token TOKEN_PROGRAM_ID
%token TOKEN_WORKING_STORAGE
%token TOKEN_PROCEDURE
%token TOKEN_STOP
%token TOKEN_RUN
%token TOKEN_MOVE
%token TOKEN_KEYWORD_TO
%token TOKEN_PERFORM
%token TOKEN_VARYING
%token TOKEN_KEYWORD_FROM
%token TOKEN_KEYWORD_BY
%token TOKEN_UNTIL
%token TOKEN_END_PERFORM
%token TOKEN_IF
%token TOKEN_ELSE_IF
%token TOKEN_ELSE
%token TOKEN_END_IF
%token TOKEN_SPACE
%token TOKEN_KEYWORD_OCCURS
%token TOKEN_KEYWORD_VALUE
%token TOKEN_KEYWORD_COMPUTE
%token TOKEN_KEYWORD_FUNCTION
%token TOKEN_IDENT
%token TOKEN_STRING
%token TOKEN_INTEGER
%token TOKEN_PICTURE
%token TOKEN_ALPHANUMERIC
%token TOKEN_NUMERIC
%token TOKEN_SIGNED_NUMERIC
%token TOKEN_IMPLIED_DECIMAL
%token TOKEN_COMPUTATION_LEVEL_0
%token TOKEN_COMPUTATION_LEVEL_1
%token TOKEN_COMPUTATION_LEVEL_2
%token TOKEN_COMPUTATION_LEVEL_3
%token TOKEN_LEFT_PARENTHESIS
%token TOKEN_RIGHT_PARENTHESIS
%token TOKEN_DOT
%token TOKEN_ADD
%token TOKEN_SUB
%token TOKEN_MULTIPLY
%token TOKEN_DIVIDE
%token TOKEN_EQUAL
%token TOKEN_GREATER_THAN
%token TOKEN_LESS_THAN
%token TOKEN_EXPONENTIAL
%token TOKEN_DISPLAY
%%
file : statements
{parser_result = $1; return 0;}
;
statements : statements statement
{ $$ = $1; $1->next = $2; }
| statement
{ $$ = $1; }
;
statement : simple_stmt
{$$ = stmt_create(STMT_BLOCK, NULL, NULL, NULL, NULL, $1, NULL, NULL);}
;
simple_stmt : cbl_func_stmt
{$$ = $1;}
;
cbl_func_stmt : display_stmt
{$$ = $1;}
;
display_stmt : TOKEN_DISPLAY expr
{$$ = stmt_create(STMT_PRINT, NULL, NULL, $2, NULL, NULL, NULL, NULL);}
;
expr : TOKEN_STRING
{ $$ = expr_create_string_literal(yytext);}
;
%%
void yyerror(const char* msg) {
fprintf(stderr, "Error | Line: %d\n%s\n",yylineno,msg);
}