fix bison parser in lab-5

This commit is contained in:
vel 2024-11-11 11:05:47 -08:00
parent 282aeafa54
commit a807c61029
Signed by: velvox
GPG Key ID: 59D9762F674151DF
4 changed files with 74 additions and 33 deletions

View File

@ -51,7 +51,6 @@ int yylex();
%token TOKEN_LEFT_PARENTHESIS %token TOKEN_LEFT_PARENTHESIS
%token TOKEN_RIGHT_PARENTHESIS %token TOKEN_RIGHT_PARENTHESIS
%token TOKEN_DOT %token TOKEN_DOT
%token TOKEN_COMMENT
%token TOKEN_ADD %token TOKEN_ADD
%token TOKEN_SUB %token TOKEN_SUB
%token TOKEN_MULTIPLY %token TOKEN_MULTIPLY
@ -65,7 +64,9 @@ int yylex();
%% %%
file : statements file : statements
statements : statements statement statements : statement_list
;
statement_list : statement_list statement
| statement | statement
; ;
statement : section statement : section
@ -85,13 +86,14 @@ type : TOKEN_KEYWORD_IDENTIFICATION
| TOKEN_STOP | TOKEN_STOP
| TOKEN_KEYWORD_DATA | TOKEN_KEYWORD_DATA
; ;
simple_stmt : cbl_function simple_stmt : cbl_func_stmt
| cbl_function op_parms
| cbl_function assignment_stmt
| cbl_function op_parms assignment_stmt
| if_branch | if_branch
| perform_stmt | perform_stmt
; ;
cbl_func_stmt : cbl_function
| cbl_function op_parms
| cbl_function assignment_stmt
| cbl_function op_parms assignment_stmt
; ;
assignment_stmt : TOKEN_EQUAL ext_function assignment_stmt : TOKEN_EQUAL ext_function
| TOKEN_EQUAL function | TOKEN_EQUAL function
@ -107,11 +109,13 @@ op_parms : op_parms TOKEN_ADD op_parms
| op_parms TOKEN_EQUAL op_parms | op_parms TOKEN_EQUAL op_parms
| TOKEN_SUB op_parms | TOKEN_SUB op_parms
| TOKEN_LEFT_PARENTHESIS op_parms TOKEN_RIGHT_PARENTHESIS | TOKEN_LEFT_PARENTHESIS op_parms TOKEN_RIGHT_PARENTHESIS
| TOKEN_IDENT | expr
| op_parms op_parms
;
expr : TOKEN_IDENT
| TOKEN_INTEGER | TOKEN_INTEGER
| TOKEN_STRING | TOKEN_STRING
| TOKEN_SPACE | TOKEN_SPACE
| op_parms op_parms
; ;
function : op_parms function : op_parms
; ;
@ -142,8 +146,8 @@ data_category : TOKEN_ALPHANUMERIC
categry_contain : TOKEN_LEFT_PARENTHESIS TOKEN_INTEGER TOKEN_RIGHT_PARENTHESIS categry_contain : TOKEN_LEFT_PARENTHESIS TOKEN_INTEGER TOKEN_RIGHT_PARENTHESIS
| TOKEN_LEFT_PARENTHESIS TOKEN_IDENT TOKEN_RIGHT_PARENTHESIS | TOKEN_LEFT_PARENTHESIS TOKEN_IDENT TOKEN_RIGHT_PARENTHESIS
; ;
complete_category: complete_category complete_category complete_category: data_category categry_contain
| data_category categry_contain | data_category categry_contain complete_category
; ;
data_clause : TOKEN_COMPUTATION_LEVEL_0 data_clause : TOKEN_COMPUTATION_LEVEL_0
| TOKEN_COMPUTATION_LEVEL_1 | TOKEN_COMPUTATION_LEVEL_1
@ -157,15 +161,18 @@ full_data_clause: data_clause data_clause
; ;
simple_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_DOT simple_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_DOT
; ;
full_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_PICTURE complete_category TOKEN_DOT complex_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_PICTURE category_spec 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 category_spec : complete_category
| complete_category data_clauses
;
data_clauses : full_data_clause
| full_data_clause TOKEN_INTEGER
; ;
data_declaration: simple_decl data_declaration: simple_decl
| full_decl | complex_decl
; ;
%% %%
void yyerror(const char* 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);

View File

@ -20,7 +20,7 @@ scanner.c: scanner.flex parser.h
flex -oscanner.c scanner.flex flex -oscanner.c scanner.flex
parser.c parser.h: parser.bison parser.c parser.h: parser.bison
bison --defines=parser.h --output=parser.c -v parser.bison -Wconflicts-sr -Wcounterexamples bison --defines=parser.h --output=parser.c -v parser.bison
# clean causes all intermediate files to be deleted. # clean causes all intermediate files to be deleted.

View File

@ -1,14 +1,41 @@
%{ %{
#define YYDEBUG 1 #define YYDEBUG 1
#include <stdio.h> #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 expr *
/*
Clunky: Manually declare the interface to the scanner generated by flex.
*/
extern char *yytext;
extern int yylex();
extern int yylineno; extern int yylineno;
void yyerror(const char*); 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 %debug
%define parse.error detailed %define parse.error detailed
%token TOKEN_EOF %token TOKEN_EOF
%token TOKEN_KEYWORD_IDENTIFICATION %token TOKEN_KEYWORD_IDENTIFICATION
%token TOKEN_KEYWORD_DIVISION %token TOKEN_KEYWORD_DIVISION
@ -51,7 +78,6 @@ int yylex();
%token TOKEN_LEFT_PARENTHESIS %token TOKEN_LEFT_PARENTHESIS
%token TOKEN_RIGHT_PARENTHESIS %token TOKEN_RIGHT_PARENTHESIS
%token TOKEN_DOT %token TOKEN_DOT
%token TOKEN_COMMENT
%token TOKEN_ADD %token TOKEN_ADD
%token TOKEN_SUB %token TOKEN_SUB
%token TOKEN_MULTIPLY %token TOKEN_MULTIPLY
@ -65,7 +91,9 @@ int yylex();
%% %%
file : statements file : statements
statements : statements statement statements : statement_list
;
statement_list : statement_list statement
| statement | statement
; ;
statement : section statement : section
@ -85,13 +113,14 @@ type : TOKEN_KEYWORD_IDENTIFICATION
| TOKEN_STOP | TOKEN_STOP
| TOKEN_KEYWORD_DATA | TOKEN_KEYWORD_DATA
; ;
simple_stmt : cbl_function simple_stmt : cbl_func_stmt
| cbl_function op_parms
| cbl_function assignment_stmt
| cbl_function op_parms assignment_stmt
| if_branch | if_branch
| perform_stmt | perform_stmt
; ;
cbl_func_stmt : cbl_function
| cbl_function op_parms
| cbl_function assignment_stmt
| cbl_function op_parms assignment_stmt
; ;
assignment_stmt : TOKEN_EQUAL ext_function assignment_stmt : TOKEN_EQUAL ext_function
| TOKEN_EQUAL function | TOKEN_EQUAL function
@ -107,11 +136,13 @@ op_parms : op_parms TOKEN_ADD op_parms
| op_parms TOKEN_EQUAL op_parms | op_parms TOKEN_EQUAL op_parms
| TOKEN_SUB op_parms | TOKEN_SUB op_parms
| TOKEN_LEFT_PARENTHESIS op_parms TOKEN_RIGHT_PARENTHESIS | TOKEN_LEFT_PARENTHESIS op_parms TOKEN_RIGHT_PARENTHESIS
| TOKEN_IDENT | expr
| op_parms op_parms
;
expr : TOKEN_IDENT
| TOKEN_INTEGER | TOKEN_INTEGER
| TOKEN_STRING | TOKEN_STRING
| TOKEN_SPACE | TOKEN_SPACE
| op_parms op_parms
; ;
function : op_parms function : op_parms
; ;
@ -142,8 +173,8 @@ data_category : TOKEN_ALPHANUMERIC
categry_contain : TOKEN_LEFT_PARENTHESIS TOKEN_INTEGER TOKEN_RIGHT_PARENTHESIS categry_contain : TOKEN_LEFT_PARENTHESIS TOKEN_INTEGER TOKEN_RIGHT_PARENTHESIS
| TOKEN_LEFT_PARENTHESIS TOKEN_IDENT TOKEN_RIGHT_PARENTHESIS | TOKEN_LEFT_PARENTHESIS TOKEN_IDENT TOKEN_RIGHT_PARENTHESIS
; ;
complete_category: complete_category complete_category complete_category: data_category categry_contain
| data_category categry_contain | data_category categry_contain complete_category
; ;
data_clause : TOKEN_COMPUTATION_LEVEL_0 data_clause : TOKEN_COMPUTATION_LEVEL_0
| TOKEN_COMPUTATION_LEVEL_1 | TOKEN_COMPUTATION_LEVEL_1
@ -157,15 +188,18 @@ full_data_clause: data_clause data_clause
; ;
simple_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_DOT simple_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_DOT
; ;
full_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_PICTURE complete_category TOKEN_DOT complex_decl : TOKEN_INTEGER TOKEN_IDENT TOKEN_PICTURE category_spec 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 category_spec : complete_category
| complete_category data_clauses
;
data_clauses : full_data_clause
| full_data_clause TOKEN_INTEGER
; ;
data_declaration: simple_decl data_declaration: simple_decl
| full_decl | complex_decl
; ;
%% %%
void yyerror(const char* 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);

View File

@ -1,5 +1,5 @@
%{ %{
#include "token.h" #include "parser.h"
%} %}
NAME [a-zA-Z]([a-zA-Z0-9_-]*[a-zA-Z0-9])? NAME [a-zA-Z]([a-zA-Z0-9_-]*[a-zA-Z0-9])?
DIGIT [0-9]+ DIGIT [0-9]+