lex中无法识别的规则错误

时间:2013-05-20 14:28:59

标签: linux lex

我正在尝试编译以下程序,但收到无法识别的规则错误。我有以下lex程序,它为第18,25,28,37,41,43,44,50,56,58,61行提供了许多无法识别的规则错误

用于运行的

命令:$ lex lab.l

%{
#include <iostream>
#include <string>
using namespace std;

%}

%option noyywrap

%%

(\"(?:[^"]|\"\")*\")(,|\r\n?|\n)?   
{   
    string temp = yytext;

    while(temp.find("\"\"")!=string::npos){ 
        temp.replace(temp.find("\"\""),2,"&quot;");
        temp.replace(temp.find("\"\""),2,"&quot;");
    }


    temp.erase(0,1);
    temp.erase(temp.find("\""), 1);


    while(temp[temp.size() - 1] == '\n'){
        temp.erase(temp.size() - 1,1);
    }


    while(temp.find("\n")!=string::npos)
    temp.replace(temp.find("\n"),1,"<br>");


    if(temp[temp.size() - 1] == ','){
        temp.erase(temp.size() - 1,1);
        cout << "<td>" << temp << "</td>";
    }
    else{
        cout << "<td>" << temp << "</td>\n</tr>\n<tr>";                             
    }
}

("(?:|"")*"|[^",\r\n]*),?   
{   
    string temp = yytext;

    if(temp[temp.size() - 1] == ','){
        temp.erase(temp.size() - 1,1);
        if(yyleng == 1)
        temp = "&nbsp;";
        cout << "<td>" << temp << "</td>";
    }
    else{

        if(yyleng > 1)
        cout << "<td>" << temp << "</td>\n</tr>\n<tr>";                             
    }
}

%%
int main(void)
{
    cout << "<html>\n\t<body>\n\t\t<table border=3>\n<tr>";
    yylex();
    cout << "</tr>\n\t\t</table>\n\t</body>\n</html>";
    return 0;
}

1 个答案:

答案 0 :(得分:1)

操作必须与模式在同一行开始才能被识别为操作。将您的代码更改为:

(\"(?:[^"]|\"\")*\")(,|\r\n?|\n)?   {   
    string temp = yytext;
          :
}

("(?:|"")*"|[^",\r\n]*),?   {   
    string temp = yytext;
          :
}

它应该可以正常工作。