1

一般的な Flex/Bison パラダイムに適合しない言語を認識しようとしています。セマンティック コンテキストに応じて、完全に異なるトークン ルールがあります。例えば:

main() {
    batchblock
    {
echo Hello World!
set batchvar=Something
echo %batchvar%
    }
}

Bison は明らかにこれらのタイプの文法の認識をサポートしていますが、それらを効果的にサポートするには「字句結合」が必要です。これを行うためのインターフェイスを提供しますが、コンテキストに応じて異なるフレックス正規表現を正確に指定する方法については混乱しています。

前もって感謝します :)

4

2 に答える 2

2
コンテキストに応じて異なるフレックス正規表現をどのように正確に提供できるかについて混乱しています

Flex には、異なる正規表現のセット間で切り替えることができる状態メカニズムがあります。これの構文は次のとおりです。

%x name_of_state

ファイルの先頭 ( の後%}) と一致ルール (最初の の後%%)

<name_of_state> *regex goes here*

次に、この正規表現は、その状態にある場合にのみ一致します。<*>あらゆる状態のあらゆるものに一致させるために使用できるグローバルな状態もあります。

状態を変更する方法は複数あります。たとえば、状態のスタックを保持yy_pop_stateyy_push_stateたい場合。または、 を使用することもできますBEGIN(name_of_state)。初期状態に戻すには、 を使用しますBEGIN(INITIAL)

于 2009-10-19T15:30:42.030 に答える
1

現状では、具体的には、特別なブロックが「batchblock {」によって一貫して通知される場合、これは完全にフレックス内で処理できます-Bison (または、生活を少しでも楽にしたい場合は byacc) 側で、「BATCH_ECHO」のようなものに変更されたトークンが表示されます。

フレックス内で処理するには、その開始条件機能を使用します。

%x batchblock
%%

"batchblock"{ws}\{   { BEGIN(batchblock); }


<batchblock>echo     { return BATCH_ECHO; }
<batchblock>set      { return BATCH_SET;  }
/* ... */
<batchblock>\}       { begin(INITIAL);    }

で始まるパターン<batchblock>は、 によって入力される「バッチブロック」状態でのみ一致できBEGIN(batchblock);ます。

于 2009-10-19T15:39:52.030 に答える