1

パターン マッチが単語の文字の後に発生するか、単語以外の文字の後に発生するかについて述語できるようにしたいと考えています。つまり、flex/lex がサポートしていないパターンの先頭にある \b word break regex char をシミュレートしたいのです。

以下は私の試みです(これは希望どおりに機能しません):

%{
#include <stdio.h>
%}

%x inword
%x nonword

%%
[a-zA-Z]    { BEGIN inword; yymore(); }
[^a-zA-Z]   { BEGIN nonword; yymore(); }

<inword>a { printf("'a' in word\n"); }
<nonword>a { printf("'a' not in word\n"); }

%%

入力:

a
ba
a

期待される出力

'a' not in word
'a' in word
'a' not in word

実際の出力:

a
'a' in word
'a' in word

私がこれを行っているのは、ダイアレクタイザーのようなことをしたいからであり、実際のレクサーの使用方法を常に学びたいと思っていました置き換えたいパターンは単語の断片である必要がある場合もあれば、単語全体のみである必要がある場合もあります。

4

2 に答える 2

3

これが私が望んでいたことを達成したものです:

%{
#include <stdio.h>
%}

WC      [A-Za-z']
NW      [^A-Za-z']

%start      INW NIW

{WC}  { BEGIN INW; REJECT; }
{NW}  { BEGIN NIW; REJECT; }

<INW>a { printf("'a' in word\n"); }
<NIW>a { printf("'a' not in word\n"); }

このようにして、任意のパターンの先頭または末尾で \B または \b と同等の操作を実行できます。a/{WC}またはを実行して最後に一致させることができますa/{NW}

文字を消費せずに状態を設定したかったのです。トリックは、yymore() ではなく REJECT を使用することです。これは、私が完全には理解していなかったと思います。

于 2009-01-05T15:39:58.703 に答える
1
%%
[a-zA-Z]+a[a-zA-Z]* {printf("a in word: %s\n", yytext);}
a[a-zA-Z]+ {printf("a in word: %s\n", yytext);}
a {printf("a not in word\n");}
. ;

テスト:

user@cody /tmp $ ./a.out <<EOF
> a
> ba
> ab
> a
> EOF
a not in word

a in word: ba

a in word: ab

a not in word
于 2009-01-03T06:30:47.297 に答える