我有一个扫描仪用于骰子符号与下面的扫描仪

%option debug
%option noyywrap
%option yylineno

%{    
#include <limits.h>
#include "parser.h"
%} 

%%

[0-9]+      {
    errno = 0;
#ifdef DEBUG
    printf("Scanner: NUMBER %s (%i)\n", yytext, yyleng);
#endif
    long number =  strtol( yytext, NULL, 10);
    if ( errno != 0 && errno != ERANGE && number == 0 ) {
        printf("Error: incorrect number %s\n", yytext);
        exit(EXIT_FAILURE);
    }
    // we only accept integers
    if ( number > INT_MAX ) {
        printf("Error: %s is too large\n", yytext );
        exit(EXIT_FAILURE);
    }
    yylval.int_type = (int)number;
    return NUMBER;
}

\+          { return PLUS;    }

\-          { return MINUS;   }

["*"x]      { return TIMES;   }

\/          { return DIV;     }

d|D         {
#ifdef DEBUG
    printf("Scanner: DICE\n");
#endif
    return DICE;
}

f|F         { return FUDGE;   }

h|H         { return HIGH;    }

l|L         { return LOW;     }

"("         { return LPAREN;  }

")"         { return RPAREN;  }

"{"         {
#ifdef DEBUG
    printf("Scanner: LCURLY\n");
#endif
    return LCURLY;
}

"}"         {
#ifdef DEBUG
    printf("Scanner: RCURLY\n");
#endif
    return RCURLY;
}

">"         { return GT; }
">="        { return GE; }
"<"         { return LT; }
"<="        { return LE; }
"!="        { return NE; }
"<>"        { return NE; }
"%"         { return PERCENT; }

,           {
#ifdef DEBUG
    printf("Scanner: COMMA\n");
#endif
    return COMMA;
}

[[:blank:]] {
    /* ignore spaces */
#ifdef DEBUG
    printf("Scanner: BLANK\n");
#endif
}

.           { printf("Error: unknown symbol '%s'\n", yytext); exit(EXIT_FAILURE); }

%%

当我解析类似4{3d6, 1d5}东西时4{3d6, 1d5}一切正常。 但是对于4{3d6,1d5} ,扫描仪有一个奇怪的行为,并错过了第一个花括号。

调试输出是

--accepting rule at line 20 ("43")
Scanner: NUMBER 43 (2)
--accepting rule at line 47 ("d")
Scanner: DICE
--accepting rule at line 20 ("641")
Scanner: NUMBER 641 (3)
--accepting rule at line 47 ("d")
Scanner: DICE

扫描仪匹配4{343尽管{不包含在[0-9]+

由于表达式中的空白触发了不同的行为,我怀疑我在空间处理中遗漏了一些东西,但我不明白为什么它应该在表达式的开头混淆整数的匹配。

任何提示?

===============>>#1 票数:3 已采纳

如果一个Unix shell正在接受你的输入4{3d6,1d5}将扩展到43d6 41d5 你的词法分析器完全忽略了空格,那么43d641d5变成了43d641d5 ,这是你所报道的(你的一些截断模数?)。

我复制了你的代码,当我运行类似的东西:

echo 4{3d6,1d5} | ./lex

我明白了你的问题。 如果我跑:

echo '4{3d6,1d5}' | ./lex

一切都很好。 如果我在文件中键入4{3d6,1d5} ,然后在文件上运行词法分析器,那也没关系。

  ask by Matteo translate from so

未解决问题?本站智能推荐: