C语言 仅当令牌在flex中单独占一行时才匹配令牌

yc0p9oo0  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(83)

我希望Flex lexer对q标记有一个特殊的情况,即只有当它是一行中除空格之外的唯一内容时,它才被识别为q标记。

S            [ \f\r\t\v]

%%

^{S}*q{S}*$  { exit(0); }

这与q * 不 * 匹配。如果我去掉尾随的$,那么它匹配;但是,它还匹配像q foo这样的东西,即,qnot 在一行上。
为什么$不起作用?我怎样才能得到我想要的?
参考:

$ flex --version
flex 2.6.4 Apple(flex-34)
sbtkgmzw

sbtkgmzw1#

我无法重现你的问题(它“对我有效”)--但证明这一观察所需的信息比一条评论所能容纳的要多。
使用以下代码变体:

%option noinput
%option nounput
%option noyywrap

S            [ \f\r\t\v]

%%

^{S}*q{S}*$  { printf("Quit!\n"); exit(0); }

%%

int main(void)
{
    yylex();
    return 0;
}

在macOS Monterey 12.6.3上使用Flex 2.6.4 Apple(flex-34)编译,我得到的输出如下:

$ flex61
Absolute
Absolute
 Aquaduct
 Aquaduct
  Q  !
  Q  !
  q  !
  q  !
  q   
Quit!
$

这看起来像是你要找的行为。在“q on its own”行的末尾有尾随空格,但是只包含q的行也会终止程序,并显示Quit!消息。我用以下命令编译了它:

flex flex61.l
clang -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes \
      -fno-common -Wno-sign-compare -Wno-nullability-completeness -o flex61 lex.yy.c

-Wno-nullability-completeness对于抑制来自<stdio.h>的大量令人讨厌的警告是必要的;-Wno-sign-compare避免了生成的C代码中的一个问题。

$ clang --version
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: x86_64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$

故障的可能原因:

  • 您的代码中有更多的规则会干扰这个规则。
  • 您可以通过确保此规则是第一个规则来修复此问题。
  • 这是我最好的猜测。
  • 你不是在用你认为你在用的代码。
  • 进行更改,例如添加'printf(“Quit!\n”):before the出口(0);'来证明您正在编辑的代码就是正在编译和执行的代码。
  • 除非您使用的是Xcode IDE,否则这可能不是问题所在。

相关问题