0

フレックスジェネレーターとその仕組みを使用しようとしています。次のコードは、テキストファイル{numbernumber}の記号のシーケンスを{"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
===========================================================

得られた出力

============================ test.out ==================

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

================================================== ======

私の質問は、与えられたテキストで、記号のシーケンス{子音子音}を{子音«a»子音}に置き換えて、置き換えの数を計算したい場合はどうなるかということです。

4

1 に答える 1

2

あなたがどのコンセプトに固執しているのかわかりません。おそらく、子音に一致する文字クラスを作成するというアイデアです。「Y」をこの質問の子音と見なし、小文字のみに一致させましょう。おそらく、一致した入力の個々の文字にアクセスする方法の問題です。これを行う1つの方法は、であると宣言yytextすること%arrayです。とにかく、必要なコードは次のようなものです。

%{
    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;
}
于 2012-06-18T13:47:40.030 に答える