2012-01-21 17 views
1

私はCのASTをトークン化するためのlexスクリプトを書いています。私は特定の文字列 "lngt"で終わる文字列を得るためにlexに正規表現を書こうとしていますが、lexによって返された最後の文字列には "lngt"は含まれません。ですから、基本的に文字列形式は(。* lngt)となりますが、これをlexでどのように行うかは分かりません。何かアドバイス/方向は本当に便利Lexで文字列 "lngt"で終わる文字列を取得する

例のようになります。私は私のファイルに次の行を持って

@65 string_cst type: @71 strg: Reverse order of the given number is : %d lngt: 42 
私はSTRG後の文字列を取得したい

:lngtと前:与えられた数のすなわち「逆順序は次のとおりです。 %d "(注:この文字列は任意の文字で構成できます)

ありがとうございました。

+0

あなたのコードは投稿できますか? – summea

答えて

0

この質問は私が書いたものと似ています。hereこれは、自分のステートマシンをlexに書くことによって行うことができます。また、コードを引用した回答または以下に引用されている他のテキストに示すように書くことによって行うこともできます。

希望する文字列が常に "strg"と "lngt"の間にあると仮定すると、これは他の非対称文字列区切り文字と同じです。いくつかの大学のコンパイラのコース上

が提案されている解決策:

%x STRG LETTERL LN LNG LNGT 
ws [ \t\r\n]+ 
%% 
<INITIAL>"strg: " { 
      BEGIN(STRG); 
      } 
<STRG>[^l]*l { 
      yymore(); 
      BEGIN(LETTERL); 
      } 
<LETTERL>n { 
      yymore(); 
      BEGIN(LN); 
      } 
<LN>g { 
      yymore(); 
      BEGIN(LNG); 
      } 
<LNG>t { 
      yymore(); 
      BEGIN(LNGT); 
      } 
<LNGT>":" { 
      printf("String is '%s'\n", yytext); 
      BEGIN(INITIAL); 
      } 
<LETTERL>[^n] { 
      BEGIN(STRG); 
      yymore(); 
      } 
<LN>[^g] { 
      BEGIN(STRG); 
      yymore(); 
      } 
<LNG>[^t] { 
      BEGIN(STRG); 
      yymore(); 
       } 
<LNGT>[^:] { 
      BEGIN(STRG); 
      yymore(); 
       } 
<INITIAL>{ws} /* skip */ ; 
<INITIAL>. /* skip anything not in the string */ 
%% 

は私の他の回答を引用します。それをうまく説明するのは here (at Manchester)です。どの引き合いに出しても問題カバー良い本のカップル:

  • J.Levine、T.Mason & D.Brown:LexとYaccの(第2版)
  • MELesk & E.Schmidt:レックスを - 字句解析ジェネレータ

説明した2つの技術は、明示的に直接文字を読み取るために、状態マシン、またはmanual inputStart Conditionsを指定するために使用することです。

関連する問題