如何判断 lex 中的无效标识符?

How to rule for invalid identifiers in lex?

我想为 lex 排除无效的标识符,我试过了但没有用,如果标识符以数字开头一定是错误的,可能还有其他事情

[0-9][a-zA-Z]*          fprintf(yyout,"ERROR IDENTIFIER\n");printf("%s: ERROR IDENTIFIER\n",yytext);

首先:欢迎来到 Whosebug。

您的规则应该是:

[0-9]+[a-zA-Z]+

因为你至少需要一个数字和一个字母。

目前您的规则 [0-9][a-zA-Z]* 匹配 074Hello、...因为 * 表示零个或多个。

添加了通常无效的标记定义,以便更好地报告错误。我想知道这是否确实是您明确打算做的?因为通常情况下,当你开始一个新的语法时(假设你是因为你的问题是关于基本的 Lex 规则),你只需指定有效的标记并让 Lex 和 Yacc 错误处理捕获错误的输入。

因此,如果您不打算明确改进错误报告,请删除此规则并仅添加有效令牌的规则(目前)。