Flex不能用于识别命名标识符中的错误

时间:2017-12-17 21:42:47

标签: regex flex-lexer

我正在尝试为一个小型语言制作一个词法分析器。其中一条规则是指不允许标识符以数字开头。 以下是定义数字和标识符的正则表达式。

NUMBER  [+-]?[0-9]+
ID  [a-zA-Z][a-zA-Z0-9_]*

以及.lxi文件中定义的规则:

%%
{DELIMITATOR}   printf("Delimitator: %s\n",yytext);
{NUMBER}    printf("Number: %s\n",yytext);
{ID}   printf("Identifier: %s\n",yytext); 
.   printf("Error: %s\n",yytext);
%%

在输入文件中出现问题时,有些令牌不符合命名标识符的规则。例如,

a := 1abc 

我得到以下结果:

Number: 1;
Identifier: abc;

相反,我想收到一条错误消息。有什么我可以做的吗?我还尝试在定义数字时使用尾随上下文,但它似乎不起作用。

1 个答案:

答案 0 :(得分:0)

不要担心:您的问题中出现的错误将在句法层面(野牛,yacc或类似)中被检测和处理/报告。

然而,如果你认为1abc错误很常见,你可以 编写特定于flex的规则来报告它。例如:

[0-9][a-zA-Z_]+   fprintf(stderr, "invalid identifier '%s'\n",yytext);
[a-zA-Z]{40,}     fprintf(stderr, "identifier to long '%s'\n",yytext);