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

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

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

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;

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

regex flex-lexer
1个回答
0
投票

不要担心:您的问题中出现的错误将在语法级别(bison,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);
© www.soinside.com 2019 - 2024. All rights reserved.