如何在flex中说“除了所有这些规则”?

时间:2013-02-27 19:24:54

标签: regex compiler-construction flex-lexer

我在flex中定义了一些正则表达式和规则。现在我想编写一个执行以下操作的正则表达式:如果有一个输入与我定义的任何规则都不匹配,我想简单地打印出该输入。您可能认为由于它与任何规则都不匹配,因此会自动打印出来,但事实并非如此。考虑一下我的例子,我定义了以下正则表达式:

[a-zA-Z_]+[a-zA-Z0-9_]*    printf("%d tIDENT (%s)\n",lineNum,yytext);

此规则定义标识符,标识符可以以下划线或字母开头,它是字母,数字和下划线的组合。

[0-9]+  printf("%d tPOSINT (%s)\n",lineNum,yytext,yytext);

此规则识别正整数。

假设这些是我唯一的规则,输入为2a3。这不是标识符,也不是整数。但我的输出以2为整数,然后以a3作为标识符。但2a3与任何规则都不匹配,我想按原样打印出来。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

  

您可能认为由于它与任何规则都不匹配,因此会自动打印出来

不,我不这么认为。如果我没记错的话,如果输入与任何规则不匹配,它会输出错误,如'flex jammed'。但在这种情况下,输入确实符合您的规则,因此不会发生。如果不匹配,请相应地更改规则。但我会离开它。 2然后a3将不会是合法的语法,所以让解析器处理它。

要避免卡纸消息并打印出不匹配消息,您需要添加如下最终规则:

。 {printf(“%s”,yytext); }。 //或者你想要的任何东西

您还需要添加空格规则。