【发布时间】:2016-12-06 01:16:08
【问题描述】:
我一直致力于使用 LPEG 实现语法高亮支持的 a text editor。启动和运行非常简单,但我只完成了最低要求。
我已经定义了一堆这样的模式:
-- 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");
【问题讨论】: