diff --git a/lab-4/parser.bison b/lab-4/parser.bison index 95eab98..458d394 100644 --- a/lab-4/parser.bison +++ b/lab-4/parser.bison @@ -10,7 +10,7 @@ int yylex(); %define parse.error detailed %token TOKEN_EOF -%token TOKEN_IDENTIFICATION +%token TOKEN_KEYWORD_IDENTIFICATION %token TOKEN_KEYWORD_DIVISION %token TOKEN_KEYWORD_DATA %token TOKEN_KEYWORD_SECTION @@ -69,40 +69,77 @@ statement : section | sect_data | simple_stmt | data_space + | data_declaration ; + section : type TOKEN_KEYWORD_DIVISION TOKEN_DOT | type TOKEN_RUN TOKEN_DOT ; -sect_data : TOKEN_PROGRAM_ID TOKEN_DOT TOKEN_IDENT TOKEN_DOT +sect_data : TOKEN_PROGRAM_ID TOKEN_DOT TOKEN_IDENT TOKEN_DOT ; -type : TOKEN_IDENTIFICATION +type : TOKEN_KEYWORD_IDENTIFICATION | TOKEN_PROCEDURE | TOKEN_STOP | TOKEN_KEYWORD_DATA ; -simple_stmt : function - | TOKEN_KEYWORD_FUNCTION cbl_function +simple_stmt : cbl_function + | cbl_function param + | cbl_function assignment_stmt + | cbl_function param assignment_stmt ; -cbl_function : TOKEN_KEYWORD_COMPUTE parms +assignment_stmt : TOKEN_EQUAL ext_function + | TOKEN_KEYWORD_TO TOKEN_IDENT + | TOKEN_KEYWORD_TO TOKEN_IDENT categry_contain ; -function : TOKEN_DISPLAY parms - | function simple_stmt - | if_branch +param : TOKEN_IDENT + | TOKEN_STRING ; -parms : TOKEN_STRING +ext_function : TOKEN_KEYWORD_FUNCTION TOKEN_IDENT TOKEN_LEFT_PARENTHESIS TOKEN_IDENT TOKEN_RIGHT_PARENTHESIS ; -if_branch : if_branch parms if_branch +cbl_function : TOKEN_DISPLAY + | TOKEN_MOVE + | TOKEN_KEYWORD_COMPUTE + | TOKEN_PERFORM + ; +if_branch : if_branch param if_branch | TOKEN_IF | TOKEN_ELSE_IF | TOKEN_ELSE | TOKEN_END_IF ; -data_space : TOKEN_WORKING_STORAGE TOKEN_KEYWORD_SECTION TOKEN_DOT +data_space : TOKEN_WORKING_STORAGE + | TOKEN_KEYWORD_SECTION + | TOKEN_DOT + ; +data_category : TOKEN_ALPHANUMERIC + | TOKEN_NUMERIC + | TOKEN_SIGNED_NUMERIC + | TOKEN_IMPLIED_DECIMAL + ; +categry_contain : TOKEN_LEFT_PARENTHESIS TOKEN_INTEGER TOKEN_RIGHT_PARENTHESIS + ; +complete_category: complete_category complete_category + | data_category categry_contain + ; +data_clause : TOKEN_COMPUTATION_LEVEL_0 + | TOKEN_COMPUTATION_LEVEL_1 + | TOKEN_COMPUTATION_LEVEL_2 + | TOKEN_COMPUTATION_LEVEL_3 + | TOKEN_KEYWORD_VALUE + | TOKEN_KEYWORD_OCCURS + ; +full_data_clause: data_clause data_clause + | data_clause + ; +simple_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_DOT + ; +full_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_PICTURE complete_category TOKEN_DOT + | TOKEN_INTEGER TOKEN_IDENT TOKEN_PICTURE complete_category full_data_clause TOKEN_DOT + | TOKEN_INTEGER TOKEN_IDENT TOKEN_PICTURE complete_category full_data_clause TOKEN_INTEGER TOKEN_DOT + ; +data_declaration: simple_decl + | full_decl ; - - - - %% diff --git a/lab-4/samples/only-variables.cbl b/lab-4/samples/only-variables.cbl new file mode 100644 index 0000000..41685e8 --- /dev/null +++ b/lab-4/samples/only-variables.cbl @@ -0,0 +1,24 @@ +IDENTIFICATION DIVISION. +PROGRAM-ID. variables. +DATA DIVISION. +WORKING-STORAGE SECTION. + 01 WS-SORT-AREA. + 05 WS-SORT-TABLE. + 10 WS-SORT-ROW PIC X(10) OCCURS 100. + 05 WS-TEMP-ROW PIC X(10). + 05 WS-ROW-MAX PIC S9(4) COMP VALUE 100. + 05 WS-SORT-MAX PIC S9(4) COMP. + 05 WS-I PIC S9(4) COMP. + 05 WS-J PIC S9(4) COMP. + 05 WS-INDEX PIC S9(4) COMP. + 77 a PIC S9(5)V9(5) COMP-3 VALUE 1. + 77 b PIC S9(5)V9(5) COMP-3 VALUE 5. + 77 c PIC S9(5)V9(5) COMP-3 VALUE 6. + 77 discriminant PIC S9(5)V9(5) COMP-3. + 77 root1 PIC S9(5)V9(5) COMP-3. + 77 root2 PIC S9(5)V9(5) COMP-3. + 77 square-root-discriminant PIC S9(5)V9(5) COMP-3. + +PROCEDURE DIVISION. + DISPLAY 'Hello World!' + STOP RUN. \ No newline at end of file diff --git a/lab-4/scanner.flex b/lab-4/scanner.flex index 4a3e7e4..5c97694 100644 --- a/lab-4/scanner.flex +++ b/lab-4/scanner.flex @@ -7,7 +7,7 @@ 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; } diff --git a/lab-4/token.h b/lab-4/token.h index fc7b161..ca9bbfb 100644 --- a/lab-4/token.h +++ b/lab-4/token.h @@ -55,7 +55,7 @@ extern int yydebug; YYerror = 256, /* error */ YYUNDEF = 257, /* "invalid token" */ TOKEN_EOF = 258, /* TOKEN_EOF */ - TOKEN_IDENTIFICATION = 259, /* TOKEN_IDENTIFICATION */ + 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 */ @@ -73,37 +73,39 @@ extern int yydebug; TOKEN_UNTIL = 274, /* TOKEN_UNTIL */ TOKEN_END_PERFORM = 275, /* TOKEN_END_PERFORM */ TOKEN_IF = 276, /* TOKEN_IF */ - TOKEN_END_IF = 277, /* TOKEN_END_IF */ - TOKEN_SPACE = 278, /* TOKEN_SPACE */ - TOKEN_KEYWORD_OCCURS = 279, /* TOKEN_KEYWORD_OCCURS */ - TOKEN_KEYWORD_VALUE = 280, /* TOKEN_KEYWORD_VALUE */ - TOKEN_KEYWORD_COMPUTE = 281, /* TOKEN_KEYWORD_COMPUTE */ - TOKEN_KEYWORD_FUNCTION = 282, /* TOKEN_KEYWORD_FUNCTION */ - TOKEN_IDENT = 283, /* TOKEN_IDENT */ - TOKEN_STRING = 284, /* TOKEN_STRING */ - TOKEN_INTEGER = 285, /* TOKEN_INTEGER */ - TOKEN_PICTURE = 286, /* TOKEN_PICTURE */ - TOKEN_ALPHANUMERIC = 287, /* TOKEN_ALPHANUMERIC */ - TOKEN_NUMERIC = 288, /* TOKEN_NUMERIC */ - TOKEN_SIGNED_NUMERIC = 289, /* TOKEN_SIGNED_NUMERIC */ - TOKEN_IMPLIED_DECIMAL = 290, /* TOKEN_IMPLIED_DECIMAL */ - TOKEN_COMPUTATION_LEVEL_0 = 291, /* TOKEN_COMPUTATION_LEVEL_0 */ - TOKEN_COMPUTATION_LEVEL_1 = 292, /* TOKEN_COMPUTATION_LEVEL_1 */ - TOKEN_COMPUTATION_LEVEL_2 = 293, /* TOKEN_COMPUTATION_LEVEL_2 */ - TOKEN_COMPUTATION_LEVEL_3 = 294, /* TOKEN_COMPUTATION_LEVEL_3 */ - TOKEN_LEFT_PARENTHESIS = 295, /* TOKEN_LEFT_PARENTHESIS */ - TOKEN_RIGHT_PARENTHESIS = 296, /* TOKEN_RIGHT_PARENTHESIS */ - TOKEN_DOT = 297, /* TOKEN_DOT */ - TOKEN_COMMENT = 298, /* TOKEN_COMMENT */ - TOKEN_ADD = 299, /* TOKEN_ADD */ - TOKEN_SUB = 300, /* TOKEN_SUB */ - TOKEN_MULTIPLY = 301, /* TOKEN_MULTIPLY */ - TOKEN_DIVIDE = 302, /* TOKEN_DIVIDE */ - TOKEN_EQUAL = 303, /* TOKEN_EQUAL */ - TOKEN_GREATER_THAN = 304, /* TOKEN_GREATER_THAN */ - TOKEN_LESS_THAN = 305, /* TOKEN_LESS_THAN */ - TOKEN_EXPONENTIAL = 306, /* TOKEN_EXPONENTIAL */ - TOKEN_DISPLAY = 307 /* TOKEN_DISPLAY */ + TOKEN_ELSE = 277, /* TOKEN_ELSE */ + TOKEN_ELSE_IF = 278, /* TOKEN_ELSE_IF */ + 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_COMMENT = 300, /* TOKEN_COMMENT */ + TOKEN_ADD = 301, /* TOKEN_ADD */ + TOKEN_SUB = 302, /* TOKEN_SUB */ + TOKEN_MULTIPLY = 303, /* TOKEN_MULTIPLY */ + TOKEN_DIVIDE = 304, /* TOKEN_DIVIDE */ + TOKEN_EQUAL = 305, /* TOKEN_EQUAL */ + TOKEN_GREATER_THAN = 306, /* TOKEN_GREATER_THAN */ + TOKEN_LESS_THAN = 307, /* TOKEN_LESS_THAN */ + TOKEN_EXPONENTIAL = 308, /* TOKEN_EXPONENTIAL */ + TOKEN_DISPLAY = 309 /* TOKEN_DISPLAY */ }; typedef enum yytokentype yytoken_kind_t; #endif