Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bison FLEX-在输出文件中获取奇怪的新行错误_Bison_Flex Lexer_Lex - Fatal编程技术网

Bison FLEX-在输出文件中获取奇怪的新行错误

Bison FLEX-在输出文件中获取奇怪的新行错误,bison,flex-lexer,lex,Bison,Flex Lexer,Lex,所以我的代码有一个奇怪的问题。虽然词法分析器成功地识别了所有的标记,但当从输入文本文件读取时,它不识别新行(保持在第1行),并且在每次成功识别标记后,它都会给我一个奇怪的错误。这是我的密码: %option noyywrap %x error %{ #include <stdio.h> #include <string.h> #include <stdlib.h> #include "token.h" int line = 1; void ERROR

所以我的代码有一个奇怪的问题。虽然词法分析器成功地识别了所有的标记,但当从输入文本文件读取时,它不识别新行(保持在第1行),并且在每次成功识别标记后,它都会给我一个奇怪的错误。这是我的密码:

%option noyywrap
%x error

%{

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


#include "token.h"

int line = 1;
void ERROR (const char *msg);

%}

// TMHMA ORISMWN
//-----------------------------------

DELIMITER   [\ \\t\\n]+
INTEGER     [+-]*(([1-9][0-9]*)|([0]))
FLOAT       [+-]?(((0+|[1-9][0-9]*)\.[0-9]+)|((0+|[1-9][0-9]*)\.)|\.[0-9]+)
([eE][+-]?[0-9]+)?
STRING      (\'[^\']*\'|\"[^\"]*\")
IDENTIFIER  [a-zA-Z_][a-zA-Z0-9_]*
AROPERATOR  [-+*/%=]
COMPERATOR  [<=>]
COMMENT     ((#)[^\n#]*|(""")[\w\W]*?("""))

%%
// TMHMA KANONWN
//-----------------------------------


\n              { line++; printf("\t#eol#\n");} 
{DELIMITER}     { }
{INTEGER}       { return INTEGER; }
{FLOAT}         { return FLOAT; }
{STRING}        { return STRING; }
{IDENTIFIER}    { return IDENTIFIER; }
{AROPERATOR}    { return AROPERATOR; }
{COMPERATOR}    { return COMPERATOR; }
{COMMENT}       { return COMMENT; }
<<EOF>>     { printf("#End of file#\n"); exit(0); }

. {ERROR("\n+Error! Can't recognise characters!\n"); BEGIN(error);}
<error>[ \n\t]  {BEGIN(0);}
<error>.    {}


%%


void ERROR(const char *msg)
{
    fprintf(yyout, "\tFlex -> ERROR, line %d at lexeme \'%s\' : %s\n",line, 
yytext, msg);
}


char *tname[8] = {"DELIMITER","INTEGER","FLOAT","STRING","IDENTIFIER","AROPERATOR","COMPERATOR","COMMENT"};


int main(int argc, char **argv){
int token; 

if(argc == 3)
{
if(!(yyin = fopen(argv[1], "r"))) 
 {
 fprintf(stderr, "Cannot read file: %s\n", argv[1]);
 return 1;
}
if(!(yyout = fopen(argv[2], "w"))) 
{
  fprintf(stderr, "Cannot create file: %s\n", argv[2]);
  return 1;
}
}
else 
if(argc == 2)
{ if(!(yyin = fopen(argv[1], "r"))) 
    {fprintf(stderr, "Cannot read file: %s\n", argv[1]);
     return 1;
    }
}


while( (token=yylex()) >= 0)
{        
    fprintf(yyout, "\tLine=%d, token=%s, value=\"%s\"\n", line, tname[token-1], yytext);
}
return 0;
}

解决了。对于有相同问题的任何人,请尝试在分隔符部分添加所有空白字符\他为我工作

DELIMITER   [ \t\r]+

问题在于分隔符规则中的双反斜杠。他们应该是单身。目前,您正在考虑\(多次指定)、空格、
t
n
作为分隔符。

是的,这是我遇到的另一个小错误。在我测试代码中不同的东西时使用了它。在我发布这个问题后修复了它。
DELIMITER   [ \t\r]+