1

在将我的词法分析器文件从 Quex 0.64.8 移植到 0.67.4 时,我遇到了字符串累加器的一些问题。我得到的问题如下所示:

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

4

1 回答 1

1

0.67.3 及更高版本从主生成器中排除了字符串累加器。原因是对于某些情况,在构造、包含推送和重置场景中没有通用解决方案。用户必须在进行时指定它们。

要使用累加器,不需要命令行选项。但是,在 .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()”。

于 2017-05-08T13:49:23.777 回答