Antlr4通道行为

Antlr4通道行为,antlr4,behavior,channels,Antlr4,Behavior,Channels,我有以下结构: mode PASS_THROUGH; END_LITERAL: PASS_THROUGH_CHAR* '{/literal}' -> popMode; PASS_THROUGH_CHAR: .+ -> channel( TEXT ); 当执行此模式时,END_LITERAL获取所有预先附加到它的PASS_-THROUGH_字符。 我想所有的PASS_-THROU

我有以下结构:

mode PASS_THROUGH;
    END_LITERAL: PASS_THROUGH_CHAR* '{/literal}'            -> popMode;
    PASS_THROUGH_CHAR: .+                                   -> channel( TEXT );
当执行此模式时,END_LITERAL获取所有预先附加到它的PASS_-THROUGH_字符。 我想所有的PASS_-THROUGH_字符都应该在文本频道上,END_-LITERAL应该只是{/LITERAL}


这种行为正确吗?

很难说为什么它会像你说的那样,但*和+on以及in PASS\u THROUGH\u CHAR的复合/冲突用法是根本原因。以下是我认为你试图实现的目标

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

mode PASS_THROUGH;
    END_LITERAL: '{/literal}'   -> popMode;
    PASS_THROUGH_CHAR: .        -> more, channel( TEXT );
更新:
我还没有完全尝试过这一点,但是使用“more”选项可能会将每个PASS_THROUGH_CHAR字符串折叠成一个标记。

这就产生了我正试图避免的问题。如果我处理一个90K文本文件,它会将每个字符作为单个标记而不是90K文本字符串放入通道。在C中执行此操作需要大约7Gb的内存来解析它,并需要大约15秒的时间来处理它。如果我按照我的方式来做,只需要一两秒钟,并且只使用了大约3MB的内存,但不幸的是,它将所有的PASS_-THROUGH_字符都放入了END_-LITERAL令牌中。我对C后端并不特别熟悉,但这种性能水平令人惊讶。你有没有对你的开始文字规则和这个模式做过Lexer单元测试?Lexer生产90k代币并不罕见。你的代币“重”吗?检测您的令牌工厂以检查令牌分配/C后端问题。后端是否可能在每个令牌中放置一个副本,而不是对输入流的引用?数学几乎是可行的。此外,lexer将在解析器真正启动之前运行到完成,那么15秒中有多少时间花在lexer上呢?所有的处理时间和内存都被lexer占用了。我可以在解析器中设置一个断点,它至少需要15秒才能到达断点。我不知道每个令牌的大小,因为几乎不可能找到引用项的运行时大小,更不用说找到附加到接口IToken的项了。尝试实现一个令牌工厂,但没有真正表现出太多。我已经把它作为bug记录了下来。看看会发生什么。