Compiler construction 理解flex生成器中的规则

Compiler construction 理解flex生成器中的规则,compiler-construction,lex,flex-lexer,Compiler Construction,Lex,Flex Lexer,我正在尝试使用flex生成器及其工作原理,下面的代码将文本文件{number number}中的符号序列替换为{“d”ws“d”},并计算替换的数量 %{ int count = 0; %} DIGIT [0-9] %% {DIGIT}{DIGIT} {count++; printf("d d");} %% int main() { yylex(); printf( "\n#Report: %d changes made!", count); return 0; } int

我正在尝试使用flex生成器及其工作原理,下面的代码将文本文件{number number}中的符号序列替换为{“d”ws“d”},并计算替换的数量

%{
   int count = 0;
%}
DIGIT [0-9]
%%
{DIGIT}{DIGIT} {count++; printf("d d");} 
%%
int main()
{
  yylex();
  printf( "\n#Report: %d changes made!", count);
  return 0;
}
int yywrap()
{
    return 1;
}
提交一个带有输入文件规则的文件并编译flex lex.yy.c后,收到一个可执行文件。对于可执行文件的输入,我们提交以下数据流

====================test.in============================
wefwe
f
weferg54gfwsfwe
fwef
wefwefwf
wefewf21321dsfredf
sdf
===========================================================
获得的输出

=======================================================测试输出==================

wefwe
f
wefergd dgfwsfwe
fwef
wefwefwf
wefewfd dd d1dsfredf
sdf
#Report: 3 changes made!
========================================================

wefwe
f
wefergd dgfwsfwe
fwef
wefwefwf
wefewfd dd d1dsfredf
sdf
#Report: 3 changes made!
我的问题是如果我想怎么办
在给定的文本中,将符号序列{consonant consonant}替换为{consonant«a»consonant}并计算替换的数量

我不确定您坚持的是什么概念。也许是写一个字符类来匹配辅音的想法:让我们把“Y”看作是这个问题的辅音,并且只匹配小写字母。也许问题在于如何访问匹配输入的单个字符:一种方法是将
yytext
声明为
%array
。无论如何,您想要的代码是这样的:

%{
   int count = 0;
%}
DIGIT [0-9]
%%
{DIGIT}{DIGIT} {count++; printf("d d");} 
%%
int main()
{
  yylex();
  printf( "\n#Report: %d changes made!", count);
  return 0;
}
int yywrap()
{
    return 1;
}
%{
    int count = 0;
    int consonantPatternCount = 0;
%}
%array
DIGIT [0-9]
CONSONANT [bcdfghjklmnpqrstvwxyz]
%%
{DIGIT}{DIGIT} {count++; printf("d d");}
{CONSONANT}{CONSONANT} { consonantPatternCount++; printf("%c a %c", yytext[0], yytext[1]);} 
%%
int main()
{
      yylex();
      printf( "\n#Report: %d changes made!", count);
      printf("\n#Report: %d consonant changes made", consonantPatternCount);
      return 0;
}
int yywrap()
{
    return 1;
}

我不明白你的问题,只是它似乎与你的标题不一致。请再试一次。我删除了“AdobeFlex”标签,并用GNUflex替换了它。