たとえば、「int」を「INT」に変換することになっています。でも、「integer」という言葉があれば、「INTeger」になるはずはないと思います。
ただし、サブストリングを定義する"int" printf("INT");
と一致します。これを防ぐ方法はありますか?
以下はあなたが望むものを捉えていると思います。
%{
#include <stdio.h>
%}
ws [\t\n ]
%%
{ws}int{ws} { printf ("%cINT%c", *yytext, yytext[4]); }
. { printf ("%c", *yytext); }
これを単語の境界({ws}
この場合は)を超えて拡張するには、修飾子を追加するか、ws
特定のチェックを追加する必要があります。
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();
}
さて、これが私がそれをした方法です:
(("int"([a-z]|[A-Z]|[0-9])+)|(([a-z]|[A-Z]|[0-9])+"int")) ECHO;
"int" printf("INT");
より良い提案を歓迎します。