ошибка парсера бизона

Я получаю следующие ошибки в моем файле lex. Я не знаю, почему это происходит. Каждая ошибка связана с каждым токеном, возвращаемым анализатору.

      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)

вот мой файл lex, который используется для отправки токенов парсеру

%{
#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);
}

должны ли возвращаемые токены быть заглавными буквами или это не имеет значения? я должен включить сюда файл анализатора или достаточно файла tab.c?


person flashdisk    schedule 10.12.2012    source источник
comment
Я удалил тег Flex, поскольку он не имеет ничего общего с UI Framework, и добавил теги gnu-flex; который используется для лексического анализатора.   -  person JeffryHouser    schedule 11.12.2012


Ответы (2)


Вы не можете использовать имя BEGIN для имени токена, потому что BEGIN уже является #defined как что-то еще по flex. Я не знаю, почему это генерирует ошибки, следующие за первой (в строке 29), но вы должны сначала попытаться исправить это, и если это не поможет, вставьте bison.tab.h.

person rici    schedule 10.12.2012

Ошибки сообщают вам, что различные токены, которые вы пытаетесь вернуть (CALL, ID, NUM, RELOP и т. д.), не были определены. Вы включаете файл bison.tab.h, а это означает, что вам не хватает объявлений %token для этих токенов в файле .y.

person Chris Dodd    schedule 11.12.2012