From 8ab4a56aade0582f9345fe91792996f6d80efd3e Mon Sep 17 00:00:00 2001 From: Riley Smith Date: Wed, 13 Nov 2024 23:20:31 -0800 Subject: [PATCH] fix lab-3 + add back else to our parsing --- lab-3/main.c | 2 +- lab-3/main_test.c | 23 ++++++++--------------- lab-3/scanner | Bin 53112 -> 71688 bytes lab-3/scanner.flex | 11 ++++++++--- lab-3/token.h | 1 + lab-5/expr.c | 6 +----- lab-5/main.c | 1 - lab-5/parser.bison | 16 ++++++++-------- lab-5/scanner.flex | 13 +++++++++---- 9 files changed, 36 insertions(+), 37 deletions(-) diff --git a/lab-3/main.c b/lab-3/main.c index 7e4a834..78770a1 100644 --- a/lab-3/main.c +++ b/lab-3/main.c @@ -25,6 +25,6 @@ int main(int argc, char *argv[]) { token_t t = yylex(); if (t == TOKEN_EOF) break; - printf("token: %d text: %s\n", t, yytext); + printf("token: %d, text: %s\n", t, yytext); } } diff --git a/lab-3/main_test.c b/lab-3/main_test.c index 1dd60bd..8f22d24 100644 --- a/lab-3/main_test.c +++ b/lab-3/main_test.c @@ -53,9 +53,6 @@ UTEST(scanner, hello) { UTEST(scanner, quadratic) { struct token_st tokens[] = { - {TOKEN_COMMENT, "*> Code altered from https://www.quora.com/What-is-a-COBOL-program-that-will-solve-a-quadratic-equation"}, - {TOKEN_COMMENT, "*> Program finds the roots to a simple quadratic equation"}, - {TOKEN_KEYWORD_IDENTIFICATION, "IDENTIFICATION"}, {TOKEN_KEYWORD_DIVISION, "DIVISION"}, {TOKEN_DOT, "."}, @@ -180,9 +177,8 @@ UTEST(scanner, quadratic) { {TOKEN_PROCEDURE, "PROCEDURE"}, {TOKEN_KEYWORD_DIVISION, "DIVISION"}, {TOKEN_DOT, "."}, - {TOKEN_COMMENT, "*> program begins here"}, {TOKEN_DISPLAY, "DISPLAY"}, - {TOKEN_STRING, "'EQUATION: (1x^2) + 5x + 6 = 0'"}, + {TOKEN_STRING, "\"EQUATION: (1x^2) + 5x + 6 = 0\""}, {TOKEN_KEYWORD_COMPUTE, "COMPUTE"}, {TOKEN_IDENT, "discriminant"}, {TOKEN_EQUAL, "="}, @@ -250,14 +246,14 @@ UTEST(scanner, quadratic) { {TOKEN_RIGHT_PARENTHESIS, ")"}, {TOKEN_DISPLAY, "DISPLAY"}, - {TOKEN_STRING, "'The equation has two distinct real roots: '"}, + {TOKEN_STRING, "\"The equation has two distinct real roots: \""}, {TOKEN_DISPLAY, "DISPLAY"}, - {TOKEN_STRING, "'Root 1: '"}, + {TOKEN_STRING, "\"Root 1: \""}, {TOKEN_IDENT, "root1"}, {TOKEN_DISPLAY, "DISPLAY"}, - {TOKEN_STRING, "'Root 2: '"}, + {TOKEN_STRING, "\"Root 2: \""}, {TOKEN_IDENT, "root2"}, // {TOKEN_EOF, ""}, @@ -282,17 +278,18 @@ UTEST(scanner, quadratic) { {TOKEN_DISPLAY, "DISPLAY"}, - {TOKEN_STRING, "'The equation has one real root: '"}, + {TOKEN_STRING, "\"The equation has one real root: \""}, {TOKEN_DISPLAY, "DISPLAY"}, - {TOKEN_STRING, "'Root: '"}, + {TOKEN_STRING, "\"Root: \""}, {TOKEN_IDENT, "root1"}, {TOKEN_ELSE, "ELSE"}, {TOKEN_DISPLAY, "DISPLAY"}, - {TOKEN_STRING, "'The equation has no real roots.'"}, + {TOKEN_STRING, "\"The equation has no real roots.\""}, + {TOKEN_END_IF, "END-IF"}, // {TOKEN_EOF, ""}, @@ -403,7 +400,6 @@ UTEST(scanner, sorting) { {TOKEN_PROCEDURE, "PROCEDURE"}, {TOKEN_KEYWORD_DIVISION, "DIVISION"}, {TOKEN_DOT, "."}, - {TOKEN_COMMENT, "*> Initialize test data"}, {TOKEN_MOVE, "MOVE"}, {TOKEN_STRING, "\"30\""}, {TOKEN_KEYWORD_TO, "TO"}, @@ -443,7 +439,6 @@ UTEST(scanner, sorting) { {TOKEN_INTEGER, "5"}, {TOKEN_KEYWORD_TO, "TO"}, {TOKEN_IDENT, "WS-SORT-MAX"}, - {TOKEN_COMMENT, "*> * Display original array"}, {TOKEN_DISPLAY, "DISPLAY"}, {TOKEN_STRING, "\"Original Array Contents:\""}, {TOKEN_DISPLAY, "DISPLAY"}, @@ -470,7 +465,6 @@ UTEST(scanner, sorting) { {TOKEN_END_PERFORM, "END-PERFORM"}, {TOKEN_DISPLAY, "DISPLAY"}, {TOKEN_SPACE, "SPACE"}, - {TOKEN_COMMENT, "*> * Simplified bubble sort"}, {TOKEN_PERFORM, "PERFORM"}, {TOKEN_VARYING, "VARYING"}, {TOKEN_IDENT, "WS-I"}, @@ -540,7 +534,6 @@ UTEST(scanner, sorting) { {TOKEN_END_IF, "END-IF"}, {TOKEN_END_PERFORM, "END-PERFORM"}, {TOKEN_END_PERFORM, "END-PERFORM"}, - {TOKEN_COMMENT, "*> * Display sorted array"}, {TOKEN_DISPLAY, "DISPLAY"}, {TOKEN_STRING, "\"Sorted Array Contents:\""}, {TOKEN_DISPLAY, "DISPLAY"}, diff --git a/lab-3/scanner b/lab-3/scanner index 896da2e7d112bdd9b0fd8bba5e7075c48dadba02..28ce88dba2b110110b8001bc3f96f5532b1f51a5 100755 GIT binary patch literal 71688 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 M82*0!X0p2f2P-r~Qvd(} literal 53112 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 M@bWG75niwV1Y6Sb^Z)<= diff --git a/lab-3/scanner.flex b/lab-3/scanner.flex index 4b7a148..262c437 100644 --- a/lab-3/scanner.flex +++ b/lab-3/scanner.flex @@ -1,6 +1,10 @@ %{ #include "token.h" %} +%option warn +%option nodefault +%option yylineno + NAME [a-zA-Z]([a-zA-Z0-9_-]*[a-zA-Z0-9])? DIGIT [0-9]+ %% @@ -26,6 +30,7 @@ UNTIL { return TOKEN_UNTIL; } PERFORM { return TOKEN_PERFORM; } END-PERFORM { return TOKEN_END_PERFORM; } IF { return TOKEN_IF; } +ELSE { return TOKEN_ELSE; } END-IF { return TOKEN_END_IF; } SPACE { return TOKEN_SPACE; } PIC { return TOKEN_PICTURE; } @@ -42,8 +47,7 @@ COMP-1 { return TOKEN_COMPUTATION_LEVEL_1; } COMP-2 { return TOKEN_COMPUTATION_LEVEL_2; } COMP-3 { return TOKEN_COMPUTATION_LEVEL_3; } -{DIGIT} { return TOKEN_INTEGER; } -{NAME} { return TOKEN_IDENT; } + \+ { return TOKEN_ADD; } \- { return TOKEN_SUB; } \*\* { return TOKEN_EXPONENTIAL; } @@ -57,8 +61,9 @@ COMP-3 { return TOKEN_COMPUTATION_LEVEL_3; } "\'"[^']*"\'" { return TOKEN_STRING; } "(" { return TOKEN_LEFT_PARENTHESIS; } ")" { return TOKEN_RIGHT_PARENTHESIS; } +{NAME} { return TOKEN_IDENT; } +{DIGIT} { return TOKEN_INTEGER; } \. { return TOKEN_DOT; } - %% int yywrap() { return 1; } diff --git a/lab-3/token.h b/lab-3/token.h index 20c1ffa..47ce470 100644 --- a/lab-3/token.h +++ b/lab-3/token.h @@ -21,6 +21,7 @@ typedef enum { TOKEN_IF, TOKEN_ELSE, TOKEN_END_IF, + TOKEN_ELSE_IF, TOKEN_SPACE, TOKEN_KEYWORD_OCCURS, TOKEN_KEYWORD_VALUE, diff --git a/lab-5/expr.c b/lab-5/expr.c index c9d6660..c9c1733 100644 --- a/lab-5/expr.c +++ b/lab-5/expr.c @@ -123,7 +123,6 @@ void stmt_print(struct stmt *s) { if (!s) return; - printf("stmt_print: %d\n", s->kind); switch (s->kind) { case STMT_DECL: @@ -148,11 +147,8 @@ void stmt_print(struct stmt *s) { case STMT_BLOCK: stmt_print(s->body); break; + // we haven't implemented sections yet case STMT_SECTION: - printf("section\n"); - printf("body: %p\n", s->body); - printf("expr: %p\n", s->expr); - printf("next: %p\n", s->next); break; } diff --git a/lab-5/main.c b/lab-5/main.c index cc05425..c0ba9d7 100644 --- a/lab-5/main.c +++ b/lab-5/main.c @@ -23,7 +23,6 @@ int main(int argc, char *argv[]) { printf( "Enter an infix expression using the operators +-*/() ending with ;\n\n"); - if (yyparse() == 0) { printf("Parse successful: "); if (parser_result != NULL) { diff --git a/lab-5/parser.bison b/lab-5/parser.bison index 0699648..01d6fa3 100644 --- a/lab-5/parser.bison +++ b/lab-5/parser.bison @@ -89,7 +89,7 @@ file : statement_list {parser_result = $1; return 0;} ; statement_list : statement statement_list - { $$ = $1; $1->next = $2; } + { $$ = $1; $1->next = $2;} | statement { $$ = $1; } ; @@ -98,7 +98,7 @@ statement : section | sect_data {$$ = $1;} | simple_stmt - {$$ = stmt_create(STMT_BLOCK, NULL, NULL, NULL, NULL, $1, NULL, NULL);} + {$$ = stmt_create(STMT_BLOCK, NULL, NULL, NULL, NULL, $1, NULL, NULL); printf("yytext1: %s\n", yytext);} | data_space {$$ = stmt_create(STMT_SECTION, NULL, NULL, NULL, NULL, NULL, NULL, NULL);} | data_declaration @@ -117,14 +117,14 @@ type : TOKEN_KEYWORD_IDENTIFICATION | TOKEN_KEYWORD_DATA ; simple_stmt : cbl_func_stmt - {$$ = $1;} + {$$ = $1; printf("yytext2: %s\n", yytext);} | if_branch | else_parts | perform_stmt ; cbl_func_stmt : cbl_function | 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); printf("yytext3: %s\n", yytext);} | cbl_function assignment_stmt | cbl_function op_parm assignment_stmt ; @@ -132,12 +132,12 @@ assignment_stmt : TOKEN_EQUAL op_parms | TOKEN_KEYWORD_TO op_parms ; op_parms : op_parm - {$$ = $1;} + {$$ = $1; printf("yytext4: %s\n", yytext);} | op_parm op_parms {$$ = $1; $1->next_expr = $2;} ; op_parm : mathmaticalexpr - {$$ = $1;} + {$$ = $1; printf("yytext5: %s\n", yytext);} | booleanexpr {$$ = $1;} ; @@ -151,7 +151,7 @@ math_op : TOKEN_ADD | TOKEN_EXPONENTIAL ; mathmaticalexpr : type_expr - {$$ = $1;} + {$$ = $1; printf("yytext6: %s\n", yytext);} | mathmaticalexpr math_op term | container_expr {$$ = $1;} @@ -169,7 +169,7 @@ type_expr : TOKEN_IDENT | TOKEN_INTEGER {$$ = expr_create_integer_literal(atoi(yytext));} | TOKEN_STRING - {$$ = expr_create_string_literal(yytext);} + {$$ = expr_create_string_literal(yytext); printf("yytext7: %s\n", yytext);} | TOKEN_SPACE {$$ = expr_create_integer_literal(0);} | TOKEN_SUB TOKEN_IDENT diff --git a/lab-5/scanner.flex b/lab-5/scanner.flex index 4b7a148..528650c 100644 --- a/lab-5/scanner.flex +++ b/lab-5/scanner.flex @@ -1,6 +1,10 @@ %{ #include "token.h" %} +%option warn +%option nodefault +%option yylineno + NAME [a-zA-Z]([a-zA-Z0-9_-]*[a-zA-Z0-9])? DIGIT [0-9]+ %% @@ -26,6 +30,7 @@ UNTIL { return TOKEN_UNTIL; } PERFORM { return TOKEN_PERFORM; } END-PERFORM { return TOKEN_END_PERFORM; } IF { return TOKEN_IF; } +ELSE { return TOKEN_ELSE; } END-IF { return TOKEN_END_IF; } SPACE { return TOKEN_SPACE; } PIC { return TOKEN_PICTURE; } @@ -42,8 +47,7 @@ COMP-1 { return TOKEN_COMPUTATION_LEVEL_1; } COMP-2 { return TOKEN_COMPUTATION_LEVEL_2; } COMP-3 { return TOKEN_COMPUTATION_LEVEL_3; } -{DIGIT} { return TOKEN_INTEGER; } -{NAME} { return TOKEN_IDENT; } + \+ { return TOKEN_ADD; } \- { return TOKEN_SUB; } \*\* { return TOKEN_EXPONENTIAL; } @@ -57,8 +61,9 @@ COMP-3 { return TOKEN_COMPUTATION_LEVEL_3; } "\'"[^']*"\'" { return TOKEN_STRING; } "(" { return TOKEN_LEFT_PARENTHESIS; } ")" { return TOKEN_RIGHT_PARENTHESIS; } +{NAME} { return TOKEN_IDENT; } +{DIGIT} { return TOKEN_INTEGER; } \. { return TOKEN_DOT; } - %% -int yywrap() { return 1; } +int yywrap() { return 1; } \ No newline at end of file