Antlr4处理yaml未加引号的多行字符串

时间:2017-11-09 16:36:50

标签: yaml antlr4

我正在尝试为一组有限的YAML语法构建解析器,类似于下面使用Antlr 4.7所示的语法:

name:
  last: Smith
  first: John
  address:
    street: 123 Main St
            Suite 100
    city: Boston
    state: MA
    zip:  12345

如果我在"值"周围加上引号,我的语法(源自Python 3语法)可以正常工作。字符串但如果删除它则会失败。似乎定义了"值"字符串如此匹配在下一个"标记之前终止:"新块的一部分或标签:"新的分配声明的一部分是诀窍。

有没有人有任何想法或工作样本来处理这个用例?

1 个答案:

答案 0 :(得分:0)

非空行的缩进应该结束普通标量的匹配。如果该缩进不超过当前映射的缩进,则标量结束。

例如:

mapping:
  key: value with
       multiple lines
  key2:
    other value

此处,value with multiple lineskey2:的行结束,因为它没有缩进多于当前映射(即上面的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语法应该给你正确的指针。