如何将 lex 输入检查为单个输入

How to check the lex input as a single input

我已经制作了一个 lex 文件,如下所示:

%%
[\t\n]
"if" {printf("IF_TOKEN\n");}
"else" {printf("ELSE_TOKEN\n");}
"while" {printf("WHILE_TOKEN\n");}
"FOR" {printf("FOR_TOKEN\n");}
"BREAK" {printf("BREAK_TOKEN\n");}
"float" {printf("FLOAT_TOKEN\n");}
"int" {printf("INT_TOKEN\n");}
"long" {printf("LONG_TOKEN\n");}
"return" {printf("RETURN_TOKEN\n");}
"defFunction" {printf("DEFFUNCTION_TOKEN\n");}
"defClass" {printf("DEFCLASS_TOKEN\n");}
"\(" {printf("PAROPEN_TOKEN\n");}
"\)" {printf("PARCLOS_TOKEN\n");}
"\{" {printf("CBROPEN_TOKEN\n");}
"\}" {printf("CBRCLOS_TOKEN\n");}
"<" {printf("LESSTHN_TOKEN\n");}
">" {printf("GRTRTHN_TOKEN\n");}
"=" {printf("EQUALTO_TOKEN\n");}
"!=" {printf("NEQUALTO_TOKEN\n");}
"\+" {printf("SUM_TOKEN\n");}
"-" {printf("MINUS_TOKEN\n");}
"\*" {printf("STAR_TOKEN\n");}
"\/" {printf("SLASH_TOKEN\n");}
"%" {printf("REMAIN_TOKEN\n");}
"\[" {printf("BRAOPEN_TOKEN\n");}
"\]" {printf("BRACLOS_TOKEN\n");}
";" {printf("SEMICOL_TOKEN\n");}
[-]?[1-9][0-9]* {printf("NUMBER\n");}
[A-Za-z&_$][A-Za-z$_]* {printf("ID\n");}
. {printf("ERROR");}

%%
int yywrap (void) {
return 1;
}
int main (int argc, char** argv) {
   yylex();
   return 0;
}

如果我在编译 .l 文件后将 125apple 作为此 lex 文件的输入,它应该打印错误但它打印 数字 ID 我如何将 125apple 作为单个输入?

在许多语言中,这正是 125apple 的词法分析方式,部分原因是天真的词法扫描器定义就是这样工作的。

如果你想让它成为一个错误,你需要通过添加一个匹配错误标记的模式来明确地让它成为一个错误。通过将它放在匹配有效数字的模式之后,您可以避免在匹配两种模式的输入上触发错误,因此错误模式也可以匹配有效标记。这使得它更容易编写。

0|[-]?[1-9][0-9]* {printf("NUMBER\n");}
[-]?[0-9]+[0-9A-Za-z_]* {printf("ERROR\n");}
[A-Za-z&_$][A-Za-z$_]* {printf("ID\n");}

上面,我做了一点改动:你的数字模式不认识0,所以我加了。

错误行不仅捕获125apple。它还会捕获其他错误标记,例如 0037-0。 (我不相信 -0 应该是一个错误;您可能想要修复它。)它不会将 123$apple 视为错误,因此您可能也想更改它。