我正在尝试为一组有限的YAML语法构建解析器,类似于下面使用Antlr 4.7所示的语法:
name:
last: Smith
first: John
address:
street: 123 Main St
Suite 100
city: Boston
state: MA
zip: 12345
如果我在"值"周围加上引号,我的语法(源自Python 3语法)可以正常工作。字符串但如果删除它则会失败。似乎定义了"值"字符串如此匹配在下一个"标记之前终止:"新块的一部分或标签:"新的分配声明的一部分是诀窍。
有没有人有任何想法或工作样本来处理这个用例?
答案 0 :(得分:0)
非空行的缩进应该结束普通标量的匹配。如果该缩进不超过当前映射的缩进,则标量结束。
例如:
mapping:
key: value with
multiple lines
key2:
other value
此处,value with multiple lines
在key2:
的行结束,因为它没有缩进多于当前映射(即上面的mapping:
的值)。当然,最后一个换行符和key2:
的缩进不是该标量内容的一部分。
在YAML规范中,这由生产
处理s-indent(n) ::= s-space × n
现在在我们的例子中,内部映射的缩进为n=2
,因此您的标量将匹配类似
plain-scalar-part (s-indent(3) s-white* plain-scalar-part)*
(我不知道Antlr的语法,只是假设这些都是非终端的)。在(可能是空的)第一行之后,你匹配一个比父映射更多的缩进(在这种情况下是3个空格),然后可能会有更多的空格(这不是内容的一部分),然后是更多的内容。为简单起见,我忽略了可能的空行。
这与行key2:
不匹配,因为它的缩进太少,这就是标量匹配结束的方式。
现在我不知道如何在Antlr中做s-indent(n)
这样的事情,但Python语法应该给你正确的指针。