我有一个antlr4 lexer语法.它有很多单词规则,但我也希望它为任何其他规则无法匹配的单词创建一个Unknown标记.我有这样的事情:
Whitespace : [ \t\n\r]+ -> skip;
Punctuation : [.,:;?!];
// Other rules here
Unknown : .+? ;
Run Code Online (Sandbox Code Playgroud)
现在生成的匹配器卡子"〜"为未知的,但对于输入创建3"〜"未知令牌"~~~",而不是一个单一的"~~~"令牌.我该怎么做才能告诉lexer为未知的连续字符生成单词标记.我也试过"未知:.;" 和"未知:.+;" 没有结果.
编辑:在当前的antlr版本.+?现在抓住剩余的单词,所以这个问题似乎得到了解决.
我有这个简单的二进制相关方法,它比g3的__builtin_popcount(我认为在启用SSE4时映射到popcnt指令)更好地比x3-4和%25更好的表查找和Hakmem位twiddling方法.
这是简化的代码:
int correlation(uint64_t *v1, uint64_t *v2, int size64) {
__m128i* a = reinterpret_cast<__m128i*>(v1);
__m128i* b = reinterpret_cast<__m128i*>(v2);
int count = 0;
for (int j = 0; j < size64 / 2; ++j, ++a, ++b) {
union { __m128i s; uint64_t b[2]} x;
x.s = _mm_xor_si128(*a, *b);
count += _mm_popcnt_u64(x.b[0]) +_mm_popcnt_u64(x.b[1]);
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
我尝试展开循环,但我认为GCC已经自动执行此操作,因此我最终获得了相同的性能.您是否认为性能进一步提高而不会使代码过于复杂?假设v1和v2具有相同的尺寸和大小是均匀的.
我对它目前的表现感到满意,但我很好奇,看看它是否可以进一步改进.
谢谢.
编辑:修复了联合中的错误,事实证明这个错误使得这个版本比内置__builtin_popcount更快,无论如何我再次修改了代码,它现在再次比内置稍快(15%),但我认为不值得投资值得时间在此.感谢所有意见和建议.
for (int j = 0; j < size64 / 4; ++j, a+=2, b+=2) {
__m128i x0 = _mm_xor_si128(_mm_load_si128(a), _mm_load_si128(b));
count += …Run Code Online (Sandbox Code Playgroud) 我使用antlr 4创建了一个词法分析器来标记土耳其语自然语言文本,我需要做的是拥有一个令牌流,我可以逐个获取令牌.如果我像这样使用它,CommonTokenStream返回一个List:
ANTLRInputStream inputStream = new ANTLRInputStream(input);
TurkishLexer lexer = new TurkishLexer(inputStream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
List<Token> tokens = tokenStream.fill();
for (Token token : token) ...
Run Code Online (Sandbox Code Playgroud)
但是我不想构建一个令牌列表,因为我的输入可能很大,我只想要这样的东西:
for (Token token: tokenStream.next()) ...
Run Code Online (Sandbox Code Playgroud)
在获得EOF令牌之前我会迭代哪个.
是否有令牌流允许我迭代令牌?