0

構文を追加して、カスタム .c ファイルの単純な解析を実装しようとしています。

例: test.c 。

// I don’t need this in output
int func1(int a, int b);

//I need this.
@parseme int func2(int a, int b);

//and this …
@parseme
void func3() 
{
Int a;
//put here where ever 
…
{
                                //inside block
                }
return;
}

.

lexer フェーズでファジー解析アプローチを使用してから、パーサー ルールで TokenRewriteStream とテンプレートを使用してトークンを書き換えます。

まあそれはレクサーピースです…

lexer grammar Lexi;

options {filter = true;}

// Pick everything between @parseme and ';' or '{ }'
METHOD
                :               HEADER .* (';' | BODY )
                ;

fragment
HEADER
                :               '@' ('parseme' | 'PARSEME') ;

fragment
BODY:   '{' .* '}' ;

.

… 専門家にとっては、この問題は単純です。「 @parseme void func3() … の最後の '}' に到達する前に。2- ブロック内で右カーリーが見つかった場合、レクサーは解析を停止します。3- そして確かにもっと多くのケースがまだテストされていません.

問題は本当に明白です。解決策も?? よろしくお願いします!! </p>

ありがとう。

4

1 に答える 1

1

自分に答えてください。

lexer grammar Lexi;

options {filter = true;}


// Pick everything between @parseme and ';' or '{}'
METHOD
    :   METHOD_HEADER (~'{')* METHOD_END ;

fragment
METHOD_HEADER
    :   '@' ('parseme' | 'PARSEME') ;

fragment
METHOD_END
    :   (';' | BLOCK ) ;

fragment
BLOCK
    :   '{' ( ~('{' | '}') | BLOCK )* '}' ;


WS  :   (' '|'\r'|'\t'|'\n')+ ;

解決策は非常に簡単でした。

于 2012-07-29T16:01:57.093 に答える