我目前正在为一个SCSS子集开发一个简单的Lex+Yacc解析器,但是在我的Linux机器上,这个词法分析器似乎工作得很完美,但在MacOS Catalina机器上,当解析输入的whitespacenewline时,它给出了一个 "意外字符:-61 "的错误。a { }
.
换句话说,似乎这个表达式中的某些字符,比如一些我不知道的空格,不被上面的regexes所接受,或者一些缓冲区没有被正确初始化,原因我找不到。
更奇怪的是,这种情况只发生在手动快速输入的情况下,而在按键之间留出约1s的休息时间,它就能顺利接受。你知道可能是什么原因造成的吗?
广泛的研究没有帮助我解决这个问题,因此我在这里问。先谢谢你。
这是目前我的解析器的全部代码,如果能帮到你的话。
%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]; }
%%
-61
是十六进制 C3
这是多字节UTF-8序列中的第一个字节,用于编码点在192-255范围内的字符。所以你不小心输入了一些字符,但我们无法判断是哪一个,因为我们需要看到第二个字节。
大多数重音字母都在这个范围内,因为它的价值。也许你不小心输入了 á
而不是 a
.
通常最好用printf格式打印未识别的字符,如 0x%02X
但这实际上不会给你更多的信息,它只是以一种更常见的形式呈现出来。