无法识别yylex()产生的错误

时间:2018-12-21 21:20:55

标签: flex-lexer lex

我正在尝试为类似Pascal的语言制作.l文件。当我使用g ++运行它时,它在使用不同文件的解析过程中经过20个步骤之后就崩溃了,其中一个定义更多,一个更少。我试图得到错误,但它只发送3个零。我在某处错过了什么吗?

这是Utile.h文件

r = Mid(z, WorksheetFunction.Find("_", z, 1) + 1, 30)

这是我的specs.l文件

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

我选择打印%{ #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

1 个答案:

答案 0 :(得分:1)

您的FIP结构仅可容纳20个条目,并且addFIP在添加新结构之前不会检查其是否已满。因此,在大约20个令牌之后,您将开始覆盖随机存储器。

既然您使用的是C ++,为什么不只使用std::vector?您只需emplace_back个令牌,由于std::vector负责所有记账,您甚至不需要跟踪有多少令牌。

话虽如此,创建令牌向量的理由很少。通常,您一次只能处理一个令牌。