在macOS上的lex解析中出现的意外字符

问题描述 投票:0回答:1

我目前正在为一个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]; }

%%

c parsing bison yacc lex
1个回答
0
投票

-61 是十六进制 C3这是多字节UTF-8序列中的第一个字节,用于编码点在192-255范围内的字符。所以你不小心输入了一些字符,但我们无法判断是哪一个,因为我们需要看到第二个字节。

大多数重音字母都在这个范围内,因为它的价值。也许你不小心输入了 á 而不是 a.

通常最好用printf格式打印未识别的字符,如 0x%02X但这实际上不会给你更多的信息,它只是以一种更常见的形式呈现出来。

© www.soinside.com 2019 - 2024. All rights reserved.