【问题标题】:FLEX - Getting weird new line error in output fileFLEX - 在输出文件中出现奇怪的换行错误
【发布时间】:2017-12-17 13:42:58
【问题描述】:

所以我的代码一直有一个奇怪的问题。虽然词法分析器成功识别了所有标记,但在从输入文本文件中读取时,它无法识别新行(停留在第 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;
}

这是错误:

Flex -> ERROR, line 1 at lexeme '' : +Error! Can't recognise characters!

【问题讨论】:

    标签: bison flex-lexer lex


    【解决方案1】:

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

    【讨论】:

    • 是的,这是我遇到的另一个小错误。当我在代码中测试不同的东西时使用它。在我发布这个问题后修复它。
    【解决方案2】:

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

    DELIMITER   [ \t\r]+
    

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 1970-01-01
      • 2012-07-26
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 2020-10-19
      • 1970-01-01
      相关资源
      最近更新 更多