简体   繁体   中英

LEX & YACC - spaces in expressions

I am reading in a file and for some reason i get a syntax error when i try an expression like 5+5 however, if i do this 5 + 5 it works good. I am baffled why it would do this?

Here is my lex file( i will leave out main that reads in a file):

%{

 #include "y.tab.h"
 #include "stdio.h"
 #include <stdlib.h>

%}
%%
(\/\*([^*]|(\*+([^*/]|[\r\n])))*\*+\/)+ {}
\/\/[^\n]*\n          {}
fd                    { return FD; }
[\r\t\n]+             {}
[ ]*                  {}
bk                    { return BK;}
setc                  {return SETC;}
[-+]?[0-9]+           { yylval = atoi(yytext); return NUMBER;}
fd[0-9]+              { }
rt                    {return RT;}
pink                  {return COLOR_TYPE;}
magenta               {return COLOR_TYPE; }
if                    {return IF; }
ifelse                {return IFELSE; }
\[                    {return LBRACKET; }
\]                    {return RBRACKET; }
\<                    {return LESS_THAN; }
\>                    {return GREATER_THAN; }
\+                    {return PLUS; }
\-                    {return MINUS; }
\/                    {return DIVIDE; }
\*                    {return MULT; }
\(                    {return LPAREN;}
\)                    {return RPAREN;}
\=                    {return EQ;}

%%

Here is part of my yacc file that deals with the expression:

expr    : NUMBER     { printf("EXPR-->NUMBER: %d\n", $1);}
   |expr PLUS expr   {$$ = $1 + $3; printf("EXPR-->expression PLUS expression: %d\n", $$);}
   |expr DIVIDE expr {$$ = $1 / $3; printf("EXPR-->expression DIVIDE expression %d\n", $$);}
   |expr MULT expr   {$$ = $1 * $3; printf("EXPR-->expression MULTIPLY expression %d\n", $$);}
   |expr MINUS expr  {$$ = $1 - $3; printf("EXPR-->expression MINUS expression %d\n", $$);}
   |COLOR_TYPE       {printf("EXPR-->COLOR\n");}
   ;

would the problem be in the lex file?

The tokenizer (lexer) returns these two to the parser: 5 and +5 . Which by your grammar (and logically) is invalid.

I think, you'd be better off, to alter your lexer and move the rules for operators up. (That means at least above the rule returning NUMBER ).

EDIT: After some thinking ( EDIT #2: and a more than useful comment by Jerry Coffin), I suggest changing the lexical rule for NUMBER to [0-9]+ . In order for the parser to still accept input like "+123" or "-123", you should add this to your grammar:

%left PLUS MINUS ...
%right UNARY

%%

expr   : number
       | expr PLUS expr
      ...
       ;

number : PLUS NUMBER %prec UNARY {$$ = $2}
       | MINUS NUMBER %prec UNARY {$$ = -$2}
       | NUMBER 
       ;

This will allow for an unary + or - before any number while still giving the operators + and - a higher precedence.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM