【问题标题】:Unexpected characters in lex parsing on macOSmacOS 上 lex 解析中的意外字符
【发布时间】: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- 很重要。

标签: c parsing bison yacc lex


【解决方案1】:

-61 是十六进制的C3,它是码位在 192-255 范围内的字符的多字节 UTF-8 序列中的第一个字节。因此,您不小心输入了一些字符,但我们无法分辨是哪个字符,因为我们需要查看第二个字节。

大多数重音字母都在这个范围内,值得。也许您不小心输入了á 而不是a

通常最好使用像0x%02X 这样的 printf 格式打印无法识别的字符,但这实际上不会为您提供更多信息;它只是以更常见的形式呈现。

【讨论】:

  • 这是 macOS 在 alt+space 上使用的一个奇怪的空白字符。谢谢!
猜你喜欢
  • 2013-05-31
  • 2018-08-18
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2016-02-24
相关资源
最近更新 更多