2009-01-02 64 views
1

我希望能夠預測模式匹配是否出現在單詞字符之後或非單詞字符之後。換句話說,我想在flex/lex不支持的模式開始處模擬\ b分詞正則表達式字符。在flex/lex中實現詞邊界狀態(解析器生成器)

這是我下面的嘗試(不工作如期望的那樣):

%{ 
#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 

我這樣做是因爲我想做類似the dialectizer的事情,我一直想學習如何使用真正的詞法分析器。有時我想要替換的模式需要是單詞的片段,有時它們只需要是整個單詞。

回答

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");} 
. ; 

測試:

[email protected] /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 
2

這裏是完成我想要的東西:

%{ 
#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}來匹配。

我想設置狀態而不消耗任何字符。訣竅是使用REJECT而不是yymore(),我想我沒有完全理解。

+0

我想你會忘記`%start`指令下的`%%`? – dyomas 2016-11-11 21:34:16