我一直在开发一个使用 LPEG 实现语法高亮支持的文本编辑器。启动和运行非常简单,但我只完成了最低要求。
我已经定义了一堆这样的模式:
-- Keywords
local keyword = C(
P"auto" +
P"break" +
P"case" +
P"char" +
P"int"
-- more ..
) / function() add_syntax( RED, ... )
这可以正确处理输入,但不幸的是匹配太多。例如int
,在 中间匹配printf
,这是预期的,因为我使用 " P
" 进行文字匹配。
显然,要执行“正确”突出显示,我需要匹配单词边界,例如“int”匹配“int”,但不匹配“printf”、“vsprintf”等。
我试图用它来限制匹配只发生在“ <[{ \n
”之后,但这并没有达到我想要的效果:
-- space, newline, comma, brackets followed by the keyword
S(" \n(<{,")^1 * P"auto" +
我在这里缺少一个简单、明显的解决方案来仅匹配由空格或您在 C 代码中期望的其他字符包围的关键字/标记吗?我确实需要捕获的令牌,以便我可以突出显示它,但除此之外,我不会接受任何特定的方法。
例如,这些应该匹配:
int foo;
void(int argc,std::list<int,int> ) { .. };
但这不应该:
fprintf(stderr, "blah. patterns are hard\n");