From 5626a5c371560baa58bfce54d6e3b053d363812e Mon Sep 17 00:00:00 2001 From: Partho Bhattacharya Date: Thu, 27 Feb 2025 14:13:19 -0500 Subject: [PATCH] testing why grammar does not work --- calc.h | 48 +++++++++++++++++++++++++++++++++++++++++++ grammar.y | 17 +++++++++++---- lexicalStructure.lex | 2 +- parser | Bin 36568 -> 36592 bytes testGrammar.y | 41 ++++++++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 calc.h create mode 100644 testGrammar.y diff --git a/calc.h b/calc.h new file mode 100644 index 0000000..2580e93 --- /dev/null +++ b/calc.h @@ -0,0 +1,48 @@ +/* Function type. */ +typedef double (func_t) (double); +/* Data type for links in the chain of symbols. */ +struct symrec +{ + char *name; /* name of symbol */ + int type; /* type of symbol: either VAR or FUN */ + union + { + double var; /* value of a VAR */ + func_t *fun; /* value of a FUN */ + } value; + struct symrec *next; /* link field */ +}; +typedef struct symrec symrec; + +/* The symbol table: a chain of 'struct symrec'. */ +extern symrec *sym_table; + +symrec *putsym (char const *name, int sym_type); +symrec *getsym (char const *name); +struct init +{ + char const *name; + func_t *fun; +}; +struct init const funs[] = +{ + { "atan", atan }, + { "cos", cos }, + { "exp", exp }, + { "ln", log }, + { "sin", sin }, + { "sqrt", sqrt }, + { 0, 0 }, +}; +/* The symbol table: a chain of 'struct symrec'. */ +symrec *sym_table; +/* Put functions in table. */ +static void +init_table (void) +{ + for (int i = 0; funs[i].name; i++) + { + symrec *ptr = putsym (funs[i].name, FUN); + ptr->value.fun = funs[i].fun; + } +} diff --git a/grammar.y b/grammar.y index 2bd520d..0b31edb 100644 --- a/grammar.y +++ b/grammar.y @@ -8,9 +8,9 @@ extern int yylex(void); void yyerror(const char *err); %} -/* + %token ID 101 -%token T_INTEGER 201 +%token T_INTEGER %token T_ADDRESS 202 %token T_BOOLEAN 203 %token T_CHARACTER 204 @@ -54,10 +54,19 @@ %token DOT 612 %token RESERVE 613 %token RELEASE 614 -%token COMMENT 700 */ +%token COMMENT 700 %% -start: /*empty for now*/ +input: /*empty for now*/ + OPTIONAL; + +OPTIONAL_OPTIONAL: + OPTIONAL + | OPTIONAL_OPTIONAL OPTIONAL {printf("expansion\n");}; + +OPTIONAL: + '[' {printf("success");} + |%empty ; // B : '{'{CreateScope(cur,line,column)} E '}'; //Braced Expressions can have braces removed to get regular expressions // D : '[' l ']'; //Declaration Lists Brackets can be taken out to get a list of Declarations diff --git a/lexicalStructure.lex b/lexicalStructure.lex index f4fb603..3bd0332 100644 --- a/lexicalStructure.lex +++ b/lexicalStructure.lex @@ -6,7 +6,7 @@ %option header-file="flex.h" %{ #include - #include "typedefs.h" + //#include "typedefs.h" #include "grammar.tab.h" int line_number = 1, column_number = 1; #ifndef DEBUG diff --git a/parser b/parser index 6d64eed3fbcd28afb96fef45560f8a51dc9797bd..432a493003aad234aab1cddeee6bf7bfb3b18924 100755 GIT binary patch delta 10389 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 delta 9977 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 /* For printf, etc. */ + #include /* For pow, used in the grammar. */ + #include "calc.h" /* Contains definition of 'symrec'. */ + int yylex (void); + void yyerror (char const *); +%} +%define api.value.type union /* Generate YYSTYPE from these types: */ +%token NUM /* Double precision number. */ +%token VAR FUN /* Symbol table pointer: variable/function. */ +%nterm exp +%precedence '=' +%left '-' '+' +%left '*' '/' +%precedence NEG /* negation--unary minus */ +%right '^' /* exponentiation */ +%% /* The grammar follows. */ +input: + %empty +| input line +; +line: + '\n' +| exp '\n' { printf ("%.10g\n", $1); } +| error '\n' { yyerrok; } +; +exp: + NUM +| VAR { $$ = $1->value.var; } +| VAR '=' exp { $$ = $3; $1->value.var = $3; } +| FUN '(' exp ')' { $$ = $1->value.fun ($3); } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = pow ($1, $3); } +| '(' exp ')' { $$ = $2; } +; +/* End of grammar. */ +%%