gpt4 book ai didi

c - flex 是否可以选择只匹配整个单词?

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:04 25 4
gpt4 key购买 nike

我正在编写词法分析器,并使用 Flex 根据自定义规则生成它。

我想匹配以字母开头然后可以包含字母或数字的各种标识符。所以我为他们写了以下模式:

[[:alpha:]][[:alnum:]]*

它工作正常,生成的词法分析器可以完美地识别模式,尽管它不仅匹配整个单词而且匹配该模式的所有出现。

例如,它将匹配输入“Text”和“9Text”(丢弃最初的 9)。

考虑以下接受上述 ID 的简单词法分析器:

%{
#include <stdio.h>

#define LINE_END 1
#define ID 2

%}

/* Flex options: */
%option noinput
%option nounput
%option noyywrap
%option yylineno

/* Definitions: */
WHITESPACE [ \t]
BLANK {WHITESPACE}+
NEW_LINE "\n"|"\r\n"
ID [[:alpha:]][[:alnum:]_]*

%%

{NEW_LINE} {printf("New line.\n"); return LINE_END;}
{BLANK} {/* Blanks are skipped */}
{ID} {printf("ID recognized: '%s'\n", yytext); return ID;}
. {fprintf(stderr, "ERROR: Invalid input in line %d: \"%s\"\n", yylineno, yytext);}

%%

int main(int argc, char **argv) {
while (yylex() != 0);
return 0;
}

当编译并提供以下输入时,会产生以下输出:

输入:

Test
9Test

输出:

Test
ID recognized: 'Test'
New line.
9Test
ERROR: Invalid input in line 2: "9"
ID recognized: 'Test'
New line.

有没有办法让 flex 只匹配整个单词(即由空格或自定义分隔符分隔,例如 '(' ')')?

因为我可以编写一个排除以数字开头的 ID 的规则,但是那些以“$Test”或“&Test”等符号开头的 ID 呢?我不认为我可以列举所有可能的符号。

按照上面的示例,所需的输出将是:

Test
ID recognized: 'Test'
New line.
9Test
ERROR: Invalid input 2: "9Test"
New line.

最佳答案

你好像同时问了两个问题。

  1. “整个单词”不是编程语言中公认的结构。词汇和语法已经定义。只需实现它们即可。

  2. 在 flex 中处理非法或意外字符的最佳方法是根本不对它们进行特殊处理。将它们返回给解析器,就像处理特殊字符一样。然后解析器可以处理它并尝试通过丢弃来恢复。

将此作为您的最终规则:

. return yytext[0];

关于c - flex 是否可以选择只匹配整个单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25675894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com