【发布时间】:2020-06-10 10:55:40
【问题描述】:
我目前正在为 SCSS 子集开发一个简单的 Lex+Yacc 解析器,但是在我的 Linux 机器上,词法分析器似乎工作得很好,在 macOS Catalina 机器上它给出了“意外字符:-61”错误时解析输入上的空格/换行符就像a { }一样简单。
换句话说,这个表达式的某些字符,例如我不知道的一些空格,似乎不被上面的正则表达式接受,或者某些缓冲区由于我找不到的原因而没有正确初始化。
为了让事情变得更奇怪,这种情况只有在手动快速输入输入时才会发生,而在按键之间留约 1 秒的间隔使它可以毫无问题地接受它。你知道是什么原因造成的吗?
广泛的研究并没有帮助我解决这个问题,因此我在这里问。提前谢谢你。
这是到目前为止我的解析器的全部代码,以防万一:
%option noyywrap
%option yylineno
%{
#include <stdlib.h>
#include <string.h>
%}
DIGIT [0-9]
NUM {DIGIT}+(\.{DIGIT}+)?
LETTER [a-zA-Z]
ID ({LETTER}|_)({LETTER}|{DIGIT}|\-|_)*
COMMENT \/\/.*\n
UNIT (px|em|\%)
%%
\@SYMTAB {print_variables();} // DEBUG
\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/ ECHO; // /**/ comments are echo-d to output
[ \v\t\n\r\f] {} // ignore whitespace
{COMMENT} {} // ignore comments of type "//"
"+" {return T_PLUS;}
"-" {return T_MINUS;}
"*" {return T_STAR;}
"/" {return T_DIV;}
"(" {return T_PL;}
")" {return T_PR;}
"{" {return T_BL;}
"}" {return T_BR;}
":" {return T_COLON;}
";" {return T_SEMICOLON;}
"," {return T_COMMA;}
">" {return T_GT;}
"." {return T_DOT;}
"#" {return T_HASH;}
{UNIT} {yylval.string = strdup(yytext); return UNIT;}
{NUM} {yylval.number = atof(yytext); return NUM;}
\${ID} {
char* name = strdup(yytext);
SYMREC* s = get_variable(name);
if(s == 0) {
s = create_variable_table(name);
}
yylval.sym = s;
return VAR;}
{ID} {yylval.string = strdup(yytext); return ID;}
. { printf("!!! ERROR Unexpected character: %d !!!\n", yytext[0]); return yytext[0]; }
%%
【问题讨论】:
-
a十六进制是61。您是否尝试过通过管道将输入从文件传送到您的程序中? -
@david:字符被打印为
%d,而不是%x,-很重要。