0

我有以下构造:

mode PASS_THROUGH;
    END_LITERAL: PASS_THROUGH_CHAR* '{/literal}'            -> popMode;
    PASS_THROUGH_CHAR: .+                                   -> channel( TEXT );

执行此模式时,END_LITERAL 会预先附加所有 PASS_THROUGH_CHAR。我会认为所有的 PASS_THROUGH_CHAR 都在 TEXT 频道上,而 END_LITERAL 只是'{/literal}

这种行为正确吗?

4

1 回答 1

0

很难说为什么它会像你说的那样表现,但是在 PASS_THROUGH_CHAR 和 PASS_THROUGH_CHAR 上使用 * 和 + 的复合/冲突使用是根本原因。以下是我认为你试图完成的事情。

START_LITERAL: '{/literal}'   -> pushMode(PASS_THROUGH);

mode PASS_THROUGH;
    END_LITERAL: '{/literal}'   -> popMode;
    PASS_THROUGH_CHAR: .        -> more, channel( TEXT );

更新:我没有完全尝试过,但使用“更多”选项可能(应该)将每个 PASS_THROUGH_CHAR 字符串折叠成一个标记。

于 2014-11-03T08:10:12.017 回答