0
votes

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 ?

2
I removed the Flex tag as this has nothing to do w/ the UI Framework and added gnu-flex tags; whic is used for the lexical analyzer. - JeffryHouser

2 Answers

1
votes

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.

1
votes

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.