0

I built a scanner->parser meant to catch modified Java. When testing it, I noticed that codeBlock never triggers but varDecls triggers. I'm not entirely sure why this happens.

Here is my parser

%{
#include <stdio.h>
extern int yylex(void);
void yyerror(char *s) {
    fprintf(stderr, "error: %s\n", s);
}

int yywrap(){ return 1;}
%}

%token INT FLOAT STRING

%union {
    int ival;
    float fval;
    char *sval;
    int bval;
}

%token <ival> NegInt
%token <ival> Int
%token <fval> Float
%token <bval> Bool
%token <sval> ifHeader
%token <sval> thenHeader
%token <sval> elseHeader
%token <sval> forHeader
%token <sval> whileHeader
%token <sval> ID
%token <sval> BinOperator
%token <sval> BoolOperator
%token <sval> Assignment
%token <sval> Quotation
%token <sval> LBracket
%token <sval> RBracket
%token <sval> LFBracket
%token <sval> RFBracket
%token <sval> Semi
%token <sval> LABracket
%token <sval> RABracket
%token <sval> Comma
%token <sval> String
%%

codeBlock:      varDecls {printf("why doth this triggering?\n");}
                | ifExprs {printf("codeBlock Statement \n");}
                ;

ifExprs:        ifExprs ifStmt 
                | ifStmt
                ;

ifStmt:         ifExpr | ifExprElse;                

ifExprElse:     ifExpr elseExpr;

ifExpr:         ifHeader LBracket boolExpr RBracket thenExpr; 

thenExpr:       thenHeader LFBracket varDecls RFBracket; 

elseExpr:       elseHeader LFBracket varDecls RFBracket;

varDecls:       varDecls varDecl
                | varDecl  
                ;

varDecl:        ID Assignment numStmt Semi
                | ID Assignment strExpr Semi 
                | ID Assignment boolExpr Semi 
                | ID Assignment Bool Semi {printf("why is this triggering?\n");}
                ;

boolExpr:       ID BoolOperator ID
                | ID BoolOperator numExpr  
                | ID BoolOperator Bool 
                ;

strExpr:        Quotation ID Quotation  
                ;


numStmt:        numStmt BinOperator numExpr 
                | numExpr
                ;   

numExpr:        LBracket numStmt RBracket
                | Int
                | Float
                | NegInt
                ;

%%

int main(int argc, char* argv[]) {
    yyparse();
}

Here is my scanner:

%{
    #include "y.tab.h"
    extern YYSTYPE yylval;
%}

%option yylineno

Digit           [0-9]
Letter          [a-zA-Z]
Word            [a-z][a-zA-Z0-9_]*

%%
"-"{Digit}+ {
                //printf("\n An assignment: %s \n", yytext);
                yylval.ival = atoi(yytext);
                return NegInt;
            }

{Digit}+    {
                //printf("\n An assignment: %s \n", yytext);
                yylval.ival = atoi(yytext);
                return Int;
            }

{Digit}+"."{Digit}+ {
                //printf("\n A float: %s (%f)\n", yytext, atof(yytext));
                yylval.ival=atof(yytext);
                return Float;
            }

True|False  {
                //printf("\n A Boolean: %s \n", yytext);
                yylval.bval = atoi(yytext);
                return Bool;
            }

if          {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return ifHeader;
            }

then        {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return thenHeader;
            }

else        {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return elseHeader;
            }

for     {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return forHeader;
            }

while       {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return whileHeader;
            }           

{Word}      {
                //printf("\n An Identifier: %s \n", yytext);
                yylval.sval = yytext;
                return ID;
            }

"'"         {
                //printf("\n An Identifier: %s \n", yytext);
                yylval.sval = yytext;
                return Quotation;
            }

"+"|"-"|"*"|"/" {
                //printf("\n An Operator: %s \n", yytext);
                yylval.sval = yytext;
                return BinOperator;
            }

"<"|">"|"!="|"<="|">="|"==" {
                //printf("\n An comparison: %s \n", yytext);
                yylval.sval = yytext;
                return BoolOperator;
            }

"="         {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return Assignment;
            }


"("         {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return LBracket;
            }   

")"         {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return RBracket;
            }

"{"         {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return LFBracket;
            }               

"}"         {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return RFBracket;
            }

";"         {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return Semi;
            }

"["         {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return LABracket;
            }

"]"         {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return RABracket;
            }

","         {
                //printf("\n An assignment: %s \n", yytext);
                yylval.sval = yytext;
                return Comma;
            }
%

As you can see with my print statements, I was trying to trigger my parser to print out "why doth this triggering" but instead varDecls is triggered instead.

Additionally, varDecl also triggers. Is that supposed to happen?

Help would be very appreciated. Thank you

splash
  • 13,037
  • 1
  • 44
  • 67
  • It would help if you included your input. Also, please remove irrelevant lines from your code (such as the commented-out printf statements.) – rici Apr 03 '17 at 22:13
  • As `codeBlock` is the start symbol it expands _either_ to `varDecls` or _to_ `ifExprs`. Is this intentional? For me, it looks like whether you forgot the recursion in `codeBlock`... (Sorry for the late answer. You didn't reply to the request for more info and there was no attention for more than a month. It would be nice if you would either remove the question or somehow react e.g. by writing an answer yourself how you solved it. In the latter case, you might even earn some reputation...) – Scheff's Cat May 03 '17 at 09:57

0 Answers0