我正在尝试用 lex 编写 C 解析器代码
%{
/* this program does the job for identifying C type integer and floats*/
%}
%%
[\t ]+ /* ignore whitespace */ ;
[0-9][5]+ { printf ("\"%s\" out of range \n", yytext); }
[-+][0-9][5] { printf ("\"%s\" is a C integers\n", yytext); }
[-+]?[0-9]*\.?[0-9]+ { printf ("\"%s\" is a float\n", yytext); }
\n ECHO; /* which is the default anyway */
%%
我在识别 C 类型整数时遇到了一个问题,因为它有一个限制,即 32767。所以我使用了正则表达式,即数字长度大于 5 应该大喊“超出范围”错误,但这是一个 hack 而不是完美的解决方案。
事实证明,这可能是不可能做对的。正则表达式构成了一种相当简单的识别(没有内存的状态机),并且实际上只适用于标记化/词法分析。您正在尝试将其用于类型检查,这需要更多的能力。
我会把它留给解析器本身。填写符号表(知道要分配给哪种变量)会容易得多,并且可以检查整数的实际值并将其与上限和下限进行比较。
我是一名优秀的程序员,十分优秀!