2017-02-28 3 views
0

私は複数のセミコロンを受け入れるルールを入れたい、シンプルなCコードを受け付けるlexを設計しています。私は試しました(; {2、})&(;; +)、それは受け入れていません。int i ;;;を検証する方法レックスで?

文LEXがオン動作するように起こっているが

int i=1; 
i=3*2;;;; 

であると私は両方のステートメントを許可するように正規表現を追加します。 Cが検証するので;;;;

+1

2つのパターンには少なくとも2セミコロンが必要です。それはあなたが意図したものですか?おそらくあなたは '; +'を試したいと思うでしょうか? –

+0

実際、私がやりたいことは、単一のセミコロンしか許さず、Cコンパイラハンドルのような文字列内の他のものをすべて削除することです;;;;; –

+1

あなたのレクサーではなくパーサでこれを行います。あなたのパーサは空の文にちょうどaccrptする必要があります。 – rici

答えて

0

私はOPを再現できません。これは私が試したものです:

ファイルtest-semicolon.l

フレックスとcygwinの上でgccでコンパイルおよびテスト
%{ 
#include <stdio.h> 
%} 

%option noyywrap 

%% 

;{2,} printf("HERE->%s", yytext); 
. ECHO; 

%% 

int main(int argc, char **argv) { yylex(); return 0; } 

$ flex -V 
flex 2.6.3 

$ flex -otest-semicolon.c test-semicolon.l ; gcc -o test-semicolon test-semicolon.c 
test-semicolon.c:398:0: warning: "yywrap" redefined 

^ 
test-semicolon.c:74:0: note: this is the location of the previous definition 

^ 

$ echo ' 
> 123 
> 123; 
> 123;; 
> 123;;; 
> 123;;;; 
> int i=1; 
> i=3*2;;;; 
> ' | ./test-semicolon 

123 
123; 
123HERE->;; 
123HERE->;;; 
123HERE->;;;; 
int i=1; 
i=3*2HERE->;;;; 

$ 

出力は、2つ以上の;の任意のシーケンスが一致していることを示しています予想通り。

Cのlexおよびyaccソースは、ANSI C grammar, Lex specificationおよびANSI C Yacc grammarで入手できます。

また、私はこの本をお勧めします:A Retargetable C Compiler: Design and Implementation

関連する問題