我正在尝试编译以下程序,但收到无法识别的规则错误。我有以下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,""");
temp.replace(temp.find("\"\""),2,""");
}
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 = " ";
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;
}
答案 0 :(得分:1)
操作必须与模式在同一行开始才能被识别为操作。将您的代码更改为:
(\"(?:[^"]|\"\")*\")(,|\r\n?|\n)? {
string temp = yytext;
:
}
("(?:|"")*"|[^",\r\n]*),? {
string temp = yytext;
:
}
它应该可以正常工作。