我有一个非常有趣的问题,解析下面的语法(Convnetional Commits)-这是一个约定git提交消息应该如何格式化。
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
- 正文是简单的多行文本,其中包含任何内容
- 页脚是具有
fobar: this is value
的键值对,并以换行符分隔它们。
关于我的困境区分body部分和footer部分的最好方法是什么?根据规范,它们应该用两个换行符分隔,所以一开始我认为这很适合ANTLR 4岛语法。我想出了类似于我发布的here的东西,但是经过一些测试,我发现它不灵活--如果没有主体(主体部分是可选的),但页脚在,它就不起作用。
我可以想到几种方法来限制语法到特定的语言,并通过语义 predicate 实现这种区分,但理想情况下,我希望避免这种情况。
现在,我认为问题归结为如何正确区分冲突的KEY
和SINGLE_LINE
标记(在我的实现的下一次迭代中)
mode Text;
KEY: [a-z][a-z_-]+;
SINGLE_LINE: ~[\n]+;
MULTI_LINE: SINGLE_LINE (NEWLINE SINGLE_LINE)*;
NEXT: NEWLINE NEWLINE;
区分KEY
和SINGLE_LINE
的最佳方法是什么?
1条答案
按热度按时间enxuqcxy1#
我会这样做:
会议委员会文件. g4
常规提交解析器.g4
解析输入(正文+页脚):
结果:
解析输入(仅正文):
结果:
解析输入(仅页脚):
结果: