flashdisk
flashdisk

Reputation: 3830

bison parser error

I get the following errors in my lex file file I don't know why that is happening each error is about each token returned to the parser

      lexical.l: In function âyylexâ:
lexical.l:29: error: expected expression before â;â token
lexical.l:30: error: âCALLâ undeclared (first use in this function)
lexical.l:30: error: (Each undeclared identifier is reported only once
lexical.l:30: error: for each function it appears in.)
lexical.l:31: error: âIDâ undeclared (first use in this function)
lexical.l:32: error: âNUMâ undeclared (first use in this function)
lexical.l:36: error: âRELOPâ undeclared (first use in this function)
lexical.l:37: error: âADDOPâ undeclared (first use in this function)
lexical.l:38: error: âMULOPâ undeclared (first use in this function)
lexical.l:39: error: âASSIGNâ undeclared (first use in this function)
lexical.l:40: error: âANDâ undeclared (first use in this function)
lexical.l:41: error: âORâ undeclared (first use in this function)
lexical.l:42: error: âNOTâ undeclared (first use in this function)

here is my lex file which is used to send tokens to the parser

%{
#include <stdio.h>
#include"bison.tab.h"
void showToken(char*);
%}

%option yylineno
%option noyywrap
digit [0-9]
letter [a-zA-Z]
whitespace [ \t]

%%
"else"                      {return ELSE;}
"real"                      {return REAL;}
"integer"                   {return INTEGER;}
"write"                     {return XWRITE;}
"while"                     {return WHILE;}
"end"                       {return END;}
"do"                        {return DO;}
"if"                        {return IF;}
"then"                      {return THEN;}
"program"                   {return XPROGRAM;}
"function"                  {return FUNCTION;}
"return"                    {return XRETURN;}
"read"                      {return XREAD;}
"var"                       {return VAR;}
"for"                       {return FOR;}
"begin"                     {return BEGIN;}
"call"                      {return CALL;}
{letter}({letter}|{digit})*         {return ID;}
{digit}{digit}*(("."{digit}{digit}*)?)      {return NUM;}
{digit}{digit}*({letter}|{digit})*      printf("Lexical Error");
[(),:;.]                return yytext[0]; 
^[\t ]+                 ;
(==|<>|<|<=|>|>=)           {return RELOP;}
(\+|-)                  {return ADDOP;}
(\*|\/)                 {return MULOP;}
(=)                 {return ASSIGN;}
(&&)                    {return AND;}
(\|\|)                  {return OR;}
(!)                 {return NOT;}
{whitespace}+               ;
"/*".*"*/"              ;
.                   {   
                    printf("Lexical Error");
                    exit(0);
                    }

%%
void showToken(char* name){
    printf("<%s,%s>",name,yytext);
}

should the tokens returned be in capital letters or it doesn't matter ? should I include the parser file here or just the tab.c file is enough ?

Upvotes: 1

Views: 1514

Answers (3)

GARVIT AGRAWAL
GARVIT AGRAWAL

Reputation: 16

I faced the similar problem- Token undeclared (first use in this function). So I tried to copy my lex and yacc file to another folder and executed the bison and flex command and compiled the files again and the issue was resolved.

Upvotes: 0

Chris Dodd
Chris Dodd

Reputation: 126536

The errors are telling you that the various tokens you're trying to return (CALL, ID, NUM, RELOP, etc) have not been defined. You're including the bison.tab.h file, so that implies that you're missing %token declarations for these tokens in the .y file.

Upvotes: 1

rici
rici

Reputation: 241931

You cannot use the name BEGIN for a token name, because BEGIN is already #defined as something else by flex. I don't know why that generates the errors following the first one (at line 29) but you should try fixing that first, and if it doesn't help, paste bison.tab.h.

Upvotes: 1

Related Questions