Невозможно определить ошибку, которую выдает yylex () - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь создать файл .l для языка, подобного Паскалю.Поскольку я запускаю его с g ++, после 20-го шага в процессе синтаксического разбора он разбивает разные файлы, у одного больше определений и у одного меньше.Я попытался получить ошибку, но она отправила только 3 нуля.Я что-то пропустил где-то?

Это файл Utile.h

#include <map>
#include <iterator>
#include <vector>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

std::vector<std::string> TS;  


typedef struct {
 int n;
 int elem[20][2];
} FIP;




void addFIP(int code, int posTS, FIP& f){
 f.elem[f.n][0]=code;
 f.elem[f.n++][1]=posTS;
}

FIP fip;
int pozTS=0;

void printFIP(FIP& f){
    ofstream fipFile;
    fipFile.open("FIP.txt");
    cout<<"nr elem fip"<<f.n<<endl;
    for(int i=0;i<f.n;i++)
        fipFile<<f.elem[0]<<" "<<f.elem[1]<<endl;
    fipFile.close();
}

И это мой файл specs.l

%{

#include "Utile.h"
%}

%option noyywrap
%option caseless



LETTER      [A-Za-z]
NR_ZEC  [0-9]
NR_NZ    [1-9] 
ZERO        [0]      
ID  {LETTER}({LETTER}|{NR_ZEC})*
NR_BASE10   {NR_NZ}+{NR_ZEC}*|{ZERO}
NR_REAL     {NR_BASE10}"."{NR_BASE10}*
DELIMIT     [;.,:]
SIR_CAR     [\"][^\n]*[\"]
CARACTER    "'"[^\n]"'"
ERR_NR_START [0-9]+[a-zA-Z0-9]*
DOT             "\."
COLON           "\:"
SEMICOLON       "\;"
COMMA           "\,"
PLUS            "\+"

%%

[ \t\n]
[0-9]+[a-zA-Z]+[a-zA-Z0-9]* {printf("Eroare - identificator incepe cu cifra %s \n", yytext);}



read        {addFIP(19,-1,fip);printf("%s\n", yytext);}
write       {addFIP(20,-1,fip);printf("%s\n", yytext);}
then        {addFIP(21,-1,fip);printf("%s\n", yytext);}
variabiles   {addFIP(22,-1,fip);printf("%s\n", yytext);}

"="        {addFIP(200,-1,fip);printf("%s\n", yytext);}
\(         {addFIP(101,-1,fip);printf("%s\n", yytext);}
\)         {addFIP(102,-1,fip);printf("%s\n", yytext);}
\;         {addFIP(103,-1,fip);printf("%s\n", yytext);}   
\,         {addFIP(104,-1,fip);printf("%s\n", yytext);}
\.         {addFIP(105,-1,fip);printf("%s\n", yytext);}
\:         {addFIP(106,-1,fip);printf("%s\n", yytext);}    

"+"     {addFIP(300,-1,fip);printf("%s", yytext);}
\-      {addFIP(301,-1,fip);printf("%s", yytext);}

integer     {addFIP(29,-1,fip);printf("%s", yytext);}
real        {addFIP(30,-1,fip);printf("%s", yytext);}




{ID}    {addFIP(0,pozTS++,fip);printf("%s\n", yytext);}
{NR_BASE10} {
             addFIP(1,pozTS++,fip);
             printf("\n%d\n", 1);
        }
{NR_REAL}   {
            addFIP(1,pozTS++,fip);
            printf("\n%d\n", 1);
        }
"'"[^\n]"'" {
            addFIP(1,pozTS++,fip);
            printf("\n%d\n", 1);
        }
{SIR_CAR}   {addFIP(1,pozTS++,fip);printf("\n%d\n", 1);}



. printf("Error %s\n", yytext);

%%
void yyerror (char const *s) {
   fprintf (stderr, "%s\n", s);
 }



extern FILE *yyin;




main(int argc, char *argv[])
{
    yyin= fopen (argv[1] , "r");
    yylex();
    cout<<yytext;
    fclose(yyin);


}

Я хочу напечатать yytext в надежде, что онпоможет мне выяснить, где проблема, но не повезло

Также, если это поможет, я запусту ее таким образом

flex specs.l
g++ lex.yy.c
a.exe test.txt

1 Ответ

0 голосов
/ 22 декабря 2018

Ваша структура FIP имеет место только для 20 записей, и addFIP не проверяет, заполнена ли она, перед добавлением новой.Итак, после примерно 20 токенов вы начнете перезаписывать случайную память.

Поскольку вы используете C ++, почему бы вам просто не использовать std::vector?Вы можете просто emplace_back токены, и вам даже не нужно отслеживать, сколько их, поскольку std::vector берет на себя всю бухгалтерию.

Сказав это, причин очень малосоздать вектор токенов.Обычно вы можете просто обрабатывать токены по одному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...