1

我在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不符合任何规则,我想按原样打印出来。我怎样才能做到这一点?

4

1 回答 1

1

你可能会想,既然不匹配任何规则,就会自动打印出来

不,我不这么认为。如果我没记错的话,如果输入不符合任何规则,它会打印一个错误,比如“flex jammed”。但在这种情况下,输入确实符合您的规则,因此不会发生。如果它不应该匹配,请相应地更改您的规则。但我会离开它。2 后跟 a3 无论如何都不是合法的语法,所以让解析器处理它。

为避免堵塞消息并打印出不匹配的内容,您需要添加如下最终规则:

. { printf("%s", yytext); }。// 或任何你想要的

您还需要添加空格规则。

于 2013-02-27T21:50:12.723 回答