1

たとえば、「int」を「INT」に変換することになっています。でも、「integer」という言葉があれば、「INTeger」になるはずはないと思います。

ただし、サブストリングを定義する"int" printf("INT");と一致します。これを防ぐ方法はありますか?

4

3 に答える 3

2

以下はあなたが望むものを捉えていると思います。

%{
#include <stdio.h>
%}

ws                      [\t\n ]

%%

{ws}int{ws}         { printf ("%cINT%c", *yytext, yytext[4]); }
.                       { printf ("%c", *yytext); }

これを単語の境界({ws}この場合は)を超えて拡張するには、修飾子を追加するか、ws特定のチェックを追加する必要があります。

于 2010-03-02T01:30:53.977 に答える
1

Lexは、現在の入力と可能な限り一致するルールを選択します。サブストリングの一致を回避するには、より長い追加のルールを含める必要がありますint。これを行う最も簡単な方法は、1文字より長い文字列を取得する単純なルールを追加することです[a-zA-Z]+。lexプログラム全体は次のようになります:-

%%

[\t ]+          /* skip whitespace */
int { printf("INT"); }
[a-zA-Z]+       /* catch-all to avoid substring matches */

%%

int main(int argc, char *argv[])
   {
   yylex();
   }
于 2010-03-02T01:18:37.230 に答える
1

さて、これが私がそれをした方法です:

(("int"([a-z]|[A-Z]|[0-9])+)|(([a-z]|[A-Z]|[0-9])+"int")) ECHO;
"int" printf("INT");

より良い提案を歓迎します。

于 2010-03-01T21:46:42.727 に答える