From e7b8c97dce5b84ce71aab9c38b988da388e8bbaa Mon Sep 17 00:00:00 2001 From: Riley Smith Date: Mon, 11 Nov 2024 11:22:13 -0800 Subject: [PATCH 1/4] test --- lab-4/parser.bison | 30 ++++++++++- lab-5/parser.bison | 1 - lab-5/token.h | 126 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 lab-5/token.h diff --git a/lab-4/parser.bison b/lab-4/parser.bison index c0c71ca..0876739 100644 --- a/lab-4/parser.bison +++ b/lab-4/parser.bison @@ -1,14 +1,41 @@ %{ #define YYDEBUG 1 #include + +#include +#include +#include +#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 expr * + +/* +Clunky: Manually declare the interface to the scanner generated by flex. +*/ + +extern char *yytext; +extern int yylex(); extern int yylineno; void yyerror(const char*); -int yylex(); + + +/* +Clunky: Keep the final result of the parse in a global variable, +so that it can be retrieved by main(). +*/ + +struct expr * parser_result = 0; %} %debug %define parse.error detailed + %token TOKEN_EOF %token TOKEN_KEYWORD_IDENTIFICATION %token TOKEN_KEYWORD_DIVISION @@ -75,7 +102,6 @@ statement : section | data_space | data_declaration ; - section : type TOKEN_KEYWORD_DIVISION TOKEN_DOT | type TOKEN_RUN TOKEN_DOT ; diff --git a/lab-5/parser.bison b/lab-5/parser.bison index e536a2c..0876739 100644 --- a/lab-5/parser.bison +++ b/lab-5/parser.bison @@ -102,7 +102,6 @@ statement : section | data_space | data_declaration ; - section : type TOKEN_KEYWORD_DIVISION TOKEN_DOT | type TOKEN_RUN TOKEN_DOT ; diff --git a/lab-5/token.h b/lab-5/token.h new file mode 100644 index 0000000..ebb85f5 --- /dev/null +++ b/lab-5/token.h @@ -0,0 +1,126 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_YY_TOKEN_H_INCLUDED +# define YY_YY_TOKEN_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 1 +#endif +#if YYDEBUG +extern int yydebug; +#endif + +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + TOKEN_EOF = 258, /* TOKEN_EOF */ + TOKEN_KEYWORD_IDENTIFICATION = 259, /* TOKEN_KEYWORD_IDENTIFICATION */ + TOKEN_KEYWORD_DIVISION = 260, /* TOKEN_KEYWORD_DIVISION */ + TOKEN_KEYWORD_DATA = 261, /* TOKEN_KEYWORD_DATA */ + TOKEN_KEYWORD_SECTION = 262, /* TOKEN_KEYWORD_SECTION */ + TOKEN_PROGRAM_ID = 263, /* TOKEN_PROGRAM_ID */ + TOKEN_WORKING_STORAGE = 264, /* TOKEN_WORKING_STORAGE */ + TOKEN_PROCEDURE = 265, /* TOKEN_PROCEDURE */ + TOKEN_STOP = 266, /* TOKEN_STOP */ + TOKEN_RUN = 267, /* TOKEN_RUN */ + TOKEN_MOVE = 268, /* TOKEN_MOVE */ + TOKEN_KEYWORD_TO = 269, /* TOKEN_KEYWORD_TO */ + TOKEN_PERFORM = 270, /* TOKEN_PERFORM */ + TOKEN_VARYING = 271, /* TOKEN_VARYING */ + TOKEN_KEYWORD_FROM = 272, /* TOKEN_KEYWORD_FROM */ + TOKEN_KEYWORD_BY = 273, /* TOKEN_KEYWORD_BY */ + TOKEN_UNTIL = 274, /* TOKEN_UNTIL */ + TOKEN_END_PERFORM = 275, /* TOKEN_END_PERFORM */ + TOKEN_IF = 276, /* TOKEN_IF */ + TOKEN_ELSE_IF = 277, /* TOKEN_ELSE_IF */ + TOKEN_ELSE = 278, /* TOKEN_ELSE */ + TOKEN_END_IF = 279, /* TOKEN_END_IF */ + TOKEN_SPACE = 280, /* TOKEN_SPACE */ + TOKEN_KEYWORD_OCCURS = 281, /* TOKEN_KEYWORD_OCCURS */ + TOKEN_KEYWORD_VALUE = 282, /* TOKEN_KEYWORD_VALUE */ + TOKEN_KEYWORD_COMPUTE = 283, /* TOKEN_KEYWORD_COMPUTE */ + TOKEN_KEYWORD_FUNCTION = 284, /* TOKEN_KEYWORD_FUNCTION */ + TOKEN_IDENT = 285, /* TOKEN_IDENT */ + TOKEN_STRING = 286, /* TOKEN_STRING */ + TOKEN_INTEGER = 287, /* TOKEN_INTEGER */ + TOKEN_PICTURE = 288, /* TOKEN_PICTURE */ + TOKEN_ALPHANUMERIC = 289, /* TOKEN_ALPHANUMERIC */ + TOKEN_NUMERIC = 290, /* TOKEN_NUMERIC */ + TOKEN_SIGNED_NUMERIC = 291, /* TOKEN_SIGNED_NUMERIC */ + TOKEN_IMPLIED_DECIMAL = 292, /* TOKEN_IMPLIED_DECIMAL */ + TOKEN_COMPUTATION_LEVEL_0 = 293, /* TOKEN_COMPUTATION_LEVEL_0 */ + TOKEN_COMPUTATION_LEVEL_1 = 294, /* TOKEN_COMPUTATION_LEVEL_1 */ + TOKEN_COMPUTATION_LEVEL_2 = 295, /* TOKEN_COMPUTATION_LEVEL_2 */ + TOKEN_COMPUTATION_LEVEL_3 = 296, /* TOKEN_COMPUTATION_LEVEL_3 */ + TOKEN_LEFT_PARENTHESIS = 297, /* TOKEN_LEFT_PARENTHESIS */ + TOKEN_RIGHT_PARENTHESIS = 298, /* TOKEN_RIGHT_PARENTHESIS */ + TOKEN_DOT = 299, /* TOKEN_DOT */ + TOKEN_ADD = 300, /* TOKEN_ADD */ + TOKEN_SUB = 301, /* TOKEN_SUB */ + TOKEN_MULTIPLY = 302, /* TOKEN_MULTIPLY */ + TOKEN_DIVIDE = 303, /* TOKEN_DIVIDE */ + TOKEN_EQUAL = 304, /* TOKEN_EQUAL */ + TOKEN_GREATER_THAN = 305, /* TOKEN_GREATER_THAN */ + TOKEN_LESS_THAN = 306, /* TOKEN_LESS_THAN */ + TOKEN_EXPONENTIAL = 307, /* TOKEN_EXPONENTIAL */ + TOKEN_DISPLAY = 308 /* TOKEN_DISPLAY */ + }; + typedef enum yytokentype yytoken_kind_t; +#endif + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + +extern YYSTYPE yylval; + + +int yyparse (void); + + +#endif /* !YY_YY_TOKEN_H_INCLUDED */ From e5b1dd03b5bd4ed389daaaa564918c6d92afaf8a Mon Sep 17 00:00:00 2001 From: Riley Smith Date: Tue, 12 Nov 2024 15:41:25 -0800 Subject: [PATCH 2/4] test bison --- lab-4/parser.bison | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/lab-4/parser.bison b/lab-4/parser.bison index 0876739..c0c71ca 100644 --- a/lab-4/parser.bison +++ b/lab-4/parser.bison @@ -1,41 +1,14 @@ %{ #define YYDEBUG 1 #include - -#include -#include -#include -#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 expr * - -/* -Clunky: Manually declare the interface to the scanner generated by flex. -*/ - -extern char *yytext; -extern int yylex(); extern int yylineno; void yyerror(const char*); - - -/* -Clunky: Keep the final result of the parse in a global variable, -so that it can be retrieved by main(). -*/ - -struct expr * parser_result = 0; +int yylex(); %} %debug %define parse.error detailed - %token TOKEN_EOF %token TOKEN_KEYWORD_IDENTIFICATION %token TOKEN_KEYWORD_DIVISION @@ -102,6 +75,7 @@ statement : section | data_space | data_declaration ; + section : type TOKEN_KEYWORD_DIVISION TOKEN_DOT | type TOKEN_RUN TOKEN_DOT ; From 9ed9e72ad26d42425de6f91283c157d490730b51 Mon Sep 17 00:00:00 2001 From: Riley Smith Date: Tue, 12 Nov 2024 16:23:41 -0800 Subject: [PATCH 3/4] fix everything --- lab-3/main.c | 2 +- lab-3/main_test.c | 6 ++-- lab-3/samples/quadratic-snippet.cbl | 17 +++++---- lab-3/scanner | Bin 0 -> 53112 bytes lab-3/scanner.flex | 9 ++--- lab-3/token.h | 2 +- lab-4/parser.bison | 54 ++++++++++++++++------------ lab-4/samples/quadratic-snippet.cbl | 2 -- lab-4/samples/sorting-snippet.cbl | 1 - 9 files changed, 48 insertions(+), 45 deletions(-) create mode 100755 lab-3/scanner diff --git a/lab-3/main.c b/lab-3/main.c index 1187003..7e4a834 100644 --- a/lab-3/main.c +++ b/lab-3/main.c @@ -8,7 +8,7 @@ extern char *yytext; int main(int argc, char *argv[]) { FILE *file; - const char *filename = "samples/quadratic_snippet.cbl"; // Default filename + const char *filename = "samples/quadratic-snippet.cbl"; // Check if a filename is provided as a command-line argument if (argc > 1) { diff --git a/lab-3/main_test.c b/lab-3/main_test.c index 1eb729a..1dd60bd 100644 --- a/lab-3/main_test.c +++ b/lab-3/main_test.c @@ -20,7 +20,7 @@ struct token_st { UTEST(scanner, hello) { struct token_st tokens[] = { - {TOKEN_IDENTIFICATION, "IDENTIFICATION"}, + {TOKEN_KEYWORD_IDENTIFICATION, "IDENTIFICATION"}, {TOKEN_KEYWORD_DIVISION, "DIVISION"}, {TOKEN_DOT, "."}, {TOKEN_PROGRAM_ID, "PROGRAM-ID"}, @@ -56,7 +56,7 @@ UTEST(scanner, quadratic) { {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_IDENTIFICATION, "IDENTIFICATION"}, + {TOKEN_KEYWORD_IDENTIFICATION, "IDENTIFICATION"}, {TOKEN_KEYWORD_DIVISION, "DIVISION"}, {TOKEN_DOT, "."}, {TOKEN_PROGRAM_ID, "PROGRAM-ID"}, @@ -316,7 +316,7 @@ UTEST(scanner, quadratic) { UTEST(scanner, sorting) { struct token_st tokens[] = { - {TOKEN_IDENTIFICATION, "IDENTIFICATION"}, + {TOKEN_KEYWORD_IDENTIFICATION, "IDENTIFICATION"}, {TOKEN_KEYWORD_DIVISION, "DIVISION"}, {TOKEN_DOT, "."}, {TOKEN_PROGRAM_ID, "PROGRAM-ID"}, diff --git a/lab-3/samples/quadratic-snippet.cbl b/lab-3/samples/quadratic-snippet.cbl index 18ba158..00eb26f 100644 --- a/lab-3/samples/quadratic-snippet.cbl +++ b/lab-3/samples/quadratic-snippet.cbl @@ -14,22 +14,21 @@ 77 square-root-discriminant PIC S9(5)V9(5) COMP-3. PROCEDURE DIVISION. *> program begins here - DISPLAY 'EQUATION: (1x^2) + 5x + 6 = 0' + DISPLAY "EQUATION: (1x^2) + 5x + 6 = 0" COMPUTE discriminant = (b ** 2) - (4 * a * c) IF discriminant > 0 COMPUTE square-root-discriminant = FUNCTION SQRT(discriminant) COMPUTE root1 = (-b + square-root-discriminant) / (2 * a) COMPUTE root2 = (-b - square-root-discriminant) / (2 * a) - DISPLAY 'The equation has two distinct real roots: ' - DISPLAY 'Root 1: ' root1 - DISPLAY 'Root 2: ' root2 - + DISPLAY "The equation has two distinct real roots: " + DISPLAY "Root 1: " root1 + DISPLAY "Root 2: " root2 ELSE IF discriminant = 0 COMPUTE root1 = -b / (2 * a) - DISPLAY 'The equation has one real root: ' - DISPLAY 'Root: ' root1 + DISPLAY "The equation has one real root: " + DISPLAY "Root: " root1 ELSE - DISPLAY 'The equation has no real roots.' - + DISPLAY "The equation has no real roots." + END-IF STOP RUN. diff --git a/lab-3/scanner b/lab-3/scanner new file mode 100755 index 0000000000000000000000000000000000000000..896da2e7d112bdd9b0fd8bba5e7075c48dadba02 GIT binary patch literal 53112 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 M@bWG75niwV1Y6Sb^Z)<= literal 0 HcmV?d00001 diff --git a/lab-3/scanner.flex b/lab-3/scanner.flex index cc22816..4b7a148 100644 --- a/lab-3/scanner.flex +++ b/lab-3/scanner.flex @@ -6,8 +6,8 @@ DIGIT [0-9]+ %% (" "|\t|\n) /* skip whitespace */ -\*>\ ?.* { return TOKEN_COMMENT; } -IDENTIFICATION { return TOKEN_IDENTIFICATION; } +\*>\ ?.* +IDENTIFICATION { return TOKEN_KEYWORD_IDENTIFICATION; } DIVISION { return TOKEN_KEYWORD_DIVISION; } PROGRAM-ID { return TOKEN_PROGRAM_ID; } PROCEDURE { return TOKEN_PROCEDURE; } @@ -27,8 +27,7 @@ PERFORM { return TOKEN_PERFORM; } END-PERFORM { return TOKEN_END_PERFORM; } IF { return TOKEN_IF; } END-IF { return TOKEN_END_IF; } -ELSE { return TOKEN_ELSE; } -SPACE { return TOKEN_SPACE; } +SPACE { return TOKEN_SPACE; } PIC { return TOKEN_PICTURE; } OCCURS { return TOKEN_KEYWORD_OCCURS; } VALUE { return TOKEN_KEYWORD_VALUE; } @@ -43,7 +42,6 @@ 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; } @@ -55,7 +53,6 @@ COMP-3 { return TOKEN_COMPUTATION_LEVEL_3; } \< { return TOKEN_LESS_THAN; } \= { return TOKEN_EQUAL;} - "\""[^"]*"\"" { return TOKEN_STRING; } "\'"[^']*"\'" { return TOKEN_STRING; } "(" { return TOKEN_LEFT_PARENTHESIS; } diff --git a/lab-3/token.h b/lab-3/token.h index e64609e..20c1ffa 100644 --- a/lab-3/token.h +++ b/lab-3/token.h @@ -1,6 +1,6 @@ typedef enum { TOKEN_EOF = 0, - TOKEN_IDENTIFICATION, + TOKEN_KEYWORD_IDENTIFICATION, TOKEN_KEYWORD_DIVISION, TOKEN_KEYWORD_DATA, TOKEN_KEYWORD_SECTION, diff --git a/lab-4/parser.bison b/lab-4/parser.bison index c0c71ca..dfeb38e 100644 --- a/lab-4/parser.bison +++ b/lab-4/parser.bison @@ -93,43 +93,53 @@ simple_stmt : cbl_func_stmt cbl_func_stmt : cbl_function | cbl_function op_parms | cbl_function assignment_stmt - | cbl_function op_parms assignment_stmt + | cbl_function op_parm assignment_stmt ; assignment_stmt : TOKEN_EQUAL ext_function - | TOKEN_EQUAL function + | TOKEN_EQUAL op_parms | TOKEN_KEYWORD_TO op_parms ; -op_parms : op_parms TOKEN_ADD op_parms - | op_parms TOKEN_SUB op_parms - | op_parms TOKEN_MULTIPLY op_parms - | op_parms TOKEN_DIVIDE op_parms - | op_parms TOKEN_EXPONENTIAL op_parms - | op_parms TOKEN_LESS_THAN op_parms - | op_parms TOKEN_GREATER_THAN op_parms - | op_parms TOKEN_EQUAL op_parms - | TOKEN_SUB op_parms - | TOKEN_LEFT_PARENTHESIS op_parms TOKEN_RIGHT_PARENTHESIS - | expr - | op_parms op_parms +op_parms : op_parm + | op_parms op_parm ; -expr : TOKEN_IDENT +op_parm : mathmaticalexpr + | booleanexpr + | type_expr + ; +mathmaticalexpr : type_expr + | mathmaticalexpr TOKEN_ADD mathmaticalexpr + | mathmaticalexpr TOKEN_SUB mathmaticalexpr + | mathmaticalexpr TOKEN_MULTIPLY mathmaticalexpr + | mathmaticalexpr TOKEN_DIVIDE mathmaticalexpr + | mathmaticalexpr TOKEN_EXPONENTIAL mathmaticalexpr + | container_expr + | type_expr container_expr + ; +container_expr : TOKEN_LEFT_PARENTHESIS op_parms TOKEN_RIGHT_PARENTHESIS + ; +booleanexpr : mathmaticalexpr TOKEN_LESS_THAN mathmaticalexpr + | mathmaticalexpr TOKEN_GREATER_THAN mathmaticalexpr + | mathmaticalexpr TOKEN_EQUAL mathmaticalexpr + ; +type_expr : TOKEN_IDENT | TOKEN_INTEGER | TOKEN_STRING | TOKEN_SPACE - ; -function : op_parms + | TOKEN_SUB TOKEN_IDENT ; ext_function : TOKEN_KEYWORD_FUNCTION TOKEN_IDENT TOKEN_LEFT_PARENTHESIS TOKEN_IDENT TOKEN_RIGHT_PARENTHESIS ; cbl_function : TOKEN_DISPLAY | TOKEN_MOVE | TOKEN_KEYWORD_COMPUTE - | TOKEN_PERFORM ; -if_branch : TOKEN_IF op_parms - | TOKEN_ELSE_IF op_parms - | TOKEN_ELSE statement - | TOKEN_END_IF +if_branch : if_start statements else_parts + ; +if_start : TOKEN_IF booleanexpr + ; +else_parts : + | TOKEN_ELSE_IF booleanexpr statements else_parts + | TOKEN_ELSE statements ; perform_stmt : TOKEN_PERFORM TOKEN_VARYING TOKEN_IDENT TOKEN_KEYWORD_FROM TOKEN_INTEGER TOKEN_KEYWORD_BY TOKEN_INTEGER TOKEN_UNTIL op_parms | TOKEN_END_PERFORM diff --git a/lab-4/samples/quadratic-snippet.cbl b/lab-4/samples/quadratic-snippet.cbl index ab76e40..7f27b4d 100644 --- a/lab-4/samples/quadratic-snippet.cbl +++ b/lab-4/samples/quadratic-snippet.cbl @@ -24,12 +24,10 @@ DISPLAY "The equation has two distinct real roots: " DISPLAY "Root 1: " root1 DISPLAY "Root 2: " root2 - ELSE IF discriminant = 0 COMPUTE root1 = -b / (2 * a) DISPLAY "The equation has one real root: " DISPLAY "Root: " root1 ELSE DISPLAY "The equation has no real roots." - STOP RUN. diff --git a/lab-4/samples/sorting-snippet.cbl b/lab-4/samples/sorting-snippet.cbl index 8324e47..07b2ebd 100644 --- a/lab-4/samples/sorting-snippet.cbl +++ b/lab-4/samples/sorting-snippet.cbl @@ -39,7 +39,6 @@ PROCEDURE DIVISION. MOVE WS-SORT-ROW(WS-J) TO WS-TEMP-ROW MOVE WS-SORT-ROW(WS-J + 1) TO WS-SORT-ROW(WS-J) MOVE WS-TEMP-ROW TO WS-SORT-ROW(WS-J + 1) - END-IF END-PERFORM END-PERFORM From 58dad1f505634083d55dc07fe066577a431a2828 Mon Sep 17 00:00:00 2001 From: Riley Smith Date: Tue, 12 Nov 2024 16:25:39 -0800 Subject: [PATCH 4/4] move over files again --- lab-5/parser.bison | 84 ++++++++++++----------------- lab-5/samples/quadratic-snippet.cbl | 2 - lab-5/samples/sorting-snippet.cbl | 1 - lab-5/scanner.flex | 2 +- 4 files changed, 35 insertions(+), 54 deletions(-) diff --git a/lab-5/parser.bison b/lab-5/parser.bison index 0876739..dfeb38e 100644 --- a/lab-5/parser.bison +++ b/lab-5/parser.bison @@ -1,41 +1,14 @@ %{ #define YYDEBUG 1 #include - -#include -#include -#include -#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 expr * - -/* -Clunky: Manually declare the interface to the scanner generated by flex. -*/ - -extern char *yytext; -extern int yylex(); extern int yylineno; void yyerror(const char*); - - -/* -Clunky: Keep the final result of the parse in a global variable, -so that it can be retrieved by main(). -*/ - -struct expr * parser_result = 0; +int yylex(); %} %debug %define parse.error detailed - %token TOKEN_EOF %token TOKEN_KEYWORD_IDENTIFICATION %token TOKEN_KEYWORD_DIVISION @@ -102,6 +75,7 @@ statement : section | data_space | data_declaration ; + section : type TOKEN_KEYWORD_DIVISION TOKEN_DOT | type TOKEN_RUN TOKEN_DOT ; @@ -119,43 +93,53 @@ simple_stmt : cbl_func_stmt cbl_func_stmt : cbl_function | cbl_function op_parms | cbl_function assignment_stmt - | cbl_function op_parms assignment_stmt + | cbl_function op_parm assignment_stmt ; assignment_stmt : TOKEN_EQUAL ext_function - | TOKEN_EQUAL function + | TOKEN_EQUAL op_parms | TOKEN_KEYWORD_TO op_parms ; -op_parms : op_parms TOKEN_ADD op_parms - | op_parms TOKEN_SUB op_parms - | op_parms TOKEN_MULTIPLY op_parms - | op_parms TOKEN_DIVIDE op_parms - | op_parms TOKEN_EXPONENTIAL op_parms - | op_parms TOKEN_LESS_THAN op_parms - | op_parms TOKEN_GREATER_THAN op_parms - | op_parms TOKEN_EQUAL op_parms - | TOKEN_SUB op_parms - | TOKEN_LEFT_PARENTHESIS op_parms TOKEN_RIGHT_PARENTHESIS - | expr - | op_parms op_parms +op_parms : op_parm + | op_parms op_parm ; -expr : TOKEN_IDENT +op_parm : mathmaticalexpr + | booleanexpr + | type_expr + ; +mathmaticalexpr : type_expr + | mathmaticalexpr TOKEN_ADD mathmaticalexpr + | mathmaticalexpr TOKEN_SUB mathmaticalexpr + | mathmaticalexpr TOKEN_MULTIPLY mathmaticalexpr + | mathmaticalexpr TOKEN_DIVIDE mathmaticalexpr + | mathmaticalexpr TOKEN_EXPONENTIAL mathmaticalexpr + | container_expr + | type_expr container_expr + ; +container_expr : TOKEN_LEFT_PARENTHESIS op_parms TOKEN_RIGHT_PARENTHESIS + ; +booleanexpr : mathmaticalexpr TOKEN_LESS_THAN mathmaticalexpr + | mathmaticalexpr TOKEN_GREATER_THAN mathmaticalexpr + | mathmaticalexpr TOKEN_EQUAL mathmaticalexpr + ; +type_expr : TOKEN_IDENT | TOKEN_INTEGER | TOKEN_STRING | TOKEN_SPACE - ; -function : op_parms + | TOKEN_SUB TOKEN_IDENT ; ext_function : TOKEN_KEYWORD_FUNCTION TOKEN_IDENT TOKEN_LEFT_PARENTHESIS TOKEN_IDENT TOKEN_RIGHT_PARENTHESIS ; cbl_function : TOKEN_DISPLAY | TOKEN_MOVE | TOKEN_KEYWORD_COMPUTE - | TOKEN_PERFORM ; -if_branch : TOKEN_IF op_parms - | TOKEN_ELSE_IF op_parms - | TOKEN_ELSE statement - | TOKEN_END_IF +if_branch : if_start statements else_parts + ; +if_start : TOKEN_IF booleanexpr + ; +else_parts : + | TOKEN_ELSE_IF booleanexpr statements else_parts + | TOKEN_ELSE statements ; perform_stmt : TOKEN_PERFORM TOKEN_VARYING TOKEN_IDENT TOKEN_KEYWORD_FROM TOKEN_INTEGER TOKEN_KEYWORD_BY TOKEN_INTEGER TOKEN_UNTIL op_parms | TOKEN_END_PERFORM diff --git a/lab-5/samples/quadratic-snippet.cbl b/lab-5/samples/quadratic-snippet.cbl index ab76e40..7f27b4d 100644 --- a/lab-5/samples/quadratic-snippet.cbl +++ b/lab-5/samples/quadratic-snippet.cbl @@ -24,12 +24,10 @@ DISPLAY "The equation has two distinct real roots: " DISPLAY "Root 1: " root1 DISPLAY "Root 2: " root2 - ELSE IF discriminant = 0 COMPUTE root1 = -b / (2 * a) DISPLAY "The equation has one real root: " DISPLAY "Root: " root1 ELSE DISPLAY "The equation has no real roots." - STOP RUN. diff --git a/lab-5/samples/sorting-snippet.cbl b/lab-5/samples/sorting-snippet.cbl index 8324e47..07b2ebd 100644 --- a/lab-5/samples/sorting-snippet.cbl +++ b/lab-5/samples/sorting-snippet.cbl @@ -39,7 +39,6 @@ PROCEDURE DIVISION. MOVE WS-SORT-ROW(WS-J) TO WS-TEMP-ROW MOVE WS-SORT-ROW(WS-J + 1) TO WS-SORT-ROW(WS-J) MOVE WS-TEMP-ROW TO WS-SORT-ROW(WS-J + 1) - END-IF END-PERFORM END-PERFORM diff --git a/lab-5/scanner.flex b/lab-5/scanner.flex index ca9acac..4b7a148 100644 --- a/lab-5/scanner.flex +++ b/lab-5/scanner.flex @@ -1,5 +1,5 @@ %{ -#include "parser.h" +#include "token.h" %} NAME [a-zA-Z]([a-zA-Z0-9_-]*[a-zA-Z0-9])? DIGIT [0-9]+