2017-05-08 1 views
1

私のlexerファイルをQuex 0.64.8から0.67.4に移植する際に、文字列アキュムレータに関するいくつかの問題に を実行しました。lexer stringアキュムレータを新しいバージョンのQuexに移植する際の問題

Severity Code Description Project File Line Suppression State 
Error C3861 'ecmascript_lexer_Accumulator__clear': identifier not found (compiling source file C:\Users\Patrikj\Work\git\ecmascript_build_vc14_x64\generated\ecmascript_lexer.cpp) ktes C:\Users\Patrikj\Work\git\ecmascript\ecmascript.qx 107 

私はそれが問題の原因である二重下線Accumulator__clearだと仮定します。問題は 私は次のようになり得ます。おそらく、私はQuexに新しいスイッチを提供する必要がありますか、または というAPIが新しいバージョンで変更されている可能性があります。いずれにしても、私はどのようにして の問題を解決したのかが分かりません。

問題を発生し、私のレクサー(.qx)から

そして例:

mode StringHelper : EOF 
<inheritable: only> 
{ 
    on_exit { 
    /// All 3 rows using the accumulator generates an error similiar to the one mentioned above 
    if(self.accumulator.text.begin != self.accumulator.text.end) 
    self_send(TOK_STRLITPART); 

    self_accumulator_flush(TOK_QUOTE); 

    self_accumulator_clear(); 
    } 
} 

この問題を修正するすべてのヘルプははるかに高く評価されるだろう。

敬具、 パトリックJ

答えて

1

バージョン0.67.3以降では 主発電機からの文字列アキュムレータを除外しました。その理由は、いくつかの状況では、 のコンストラクトにinclude-push、 の一般的な解決策がなく、シナリオをリセットしているためです。ユーザーは、彼らが進むにつれてそれらを指定する必要があります。

アキュムレータを使用する場合、コマンドラインオプションは不要です。 しかし、.qxに以下のセクションでは(これは一例である) を定義する必要があるファイル:

header { 
#include <quex/code_base/extra/accumulator/Accumulator> 
} 

footer { 
#include <quex/code_base/extra/accumulator/Accumulator.i> 
} 
body { 
    QUEX_NAME(Accumulator)   accumulator; 
} 
constructor { 
    if(! QUEX_NAME(Accumulator_construct)(&me->accumulator, me)) { 
     return false; 
    } 
} 
destructor { 
    QUEX_NAME(Accumulator_destruct)(&me->accumulator); 
} 
print { 
    QUEX_NAME(Accumulator_print_this)(&me->accumulator); 
} 

PostCategorizerの場合と同じです。下に示すセットアップ は、デモサブディレクトリの 'common.qx'ファイルにあります。

また、 'flush()'の後に 'clear()'する必要はありません。

関連する問題