gpt4 book ai didi

flex-lexer - 奇怪的弹性行为

转载 作者:行者123 更新时间:2023-12-01 23:43:23 27 4
gpt4 key购买 nike

我有一个扫描仪dice notation 使用以下扫描器

%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} 扫描器有一个奇怪的行为并且错过了第一个大括号。

调试输出为

--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

尽管 [0-9]+< 中不包含 {,但扫描仪将 4{3 匹配为 43/.

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

有什么提示吗?

最佳答案

如果 Unix shell 处理您的输入,4{3d6,1d5} 将扩展为 43d6 41d5。您的词法分析器完全忽略了空白,因此变成了 43d641d5,这就是您要报告的内容(对您的部分截断取模?)。

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

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

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

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

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

关于flex-lexer - 奇怪的弹性行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30286050/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com