如何判断 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]*
匹配 0
、7
、4Hello
、...因为 *
表示零个或多个。
添加了通常无效的标记定义,以便更好地报告错误。我想知道这是否确实是您明确打算做的?因为通常情况下,当你开始一个新的语法时(假设你是因为你的问题是关于基本的 Lex 规则),你只需指定有效的标记并让 Lex 和 Yacc 错误处理捕获错误的输入。
因此,如果您不打算明确改进错误报告,请删除此规则并仅添加有效令牌的规则(目前)。
我想为 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]*
匹配 0
、7
、4Hello
、...因为 *
表示零个或多个。
添加了通常无效的标记定义,以便更好地报告错误。我想知道这是否确实是您明确打算做的?因为通常情况下,当你开始一个新的语法时(假设你是因为你的问题是关于基本的 Lex 规则),你只需指定有效的标记并让 Lex 和 Yacc 错误处理捕获错误的输入。
因此,如果您不打算明确改进错误报告,请删除此规则并仅添加有效令牌的规则(目前)。