0

次のプログラムをコンパイルしようとしていますが、認識できないルール エラーが発生します。次の 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;
}
4

1 に答える 1

1

アクションとして認識されるためには、アクションはパターンと同じ行で開始する必要があります。コードを次のように変更します。

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

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

そしてそれはうまくいくはずです。

于 2013-05-20T20:30:59.727 に答える