修改基于JSON的语法以允许尾随逗号

时间:2013-09-14 08:40:37

标签: php json doctrine-orm bnf

所以Doctrine注释基于JSON,但由于PHP数组允许悬空逗号,Drupal人很习惯这一点,说实话,编辑起来要容易得多

(
  "foo" => "bar",
  "foo1" => "bar1",
)

这样可以切换行,添加另一行等,而不是bar1之后的逗号丢失。

所以我试图patch学说允许这样做。维护者声称

  

您通过检查不属于“值”的标记来混合语法规则,但是它的父标记“注释”。

他是对的。所以,我们正在寻找更好的语法。

Annotation     ::= "@" AnnotationName ["(" [Values] ")"]
Values ::= Array | Value {"," Value}*

如何在值中允许使用尾随逗号?

2 个答案:

答案 0 :(得分:4)

修改后的语法不再是LL(1)。因此,Doctrine实现的简单递归下降解析器需要回溯。

在这种情况下,您需要确保::Value()可以回溯,即。触发异常并将解析重置为输入::Value()之前的位置。您捕获此异常,只要您已有一个有效值,就在::Values()中忽略它。

这需要能够在词法分析器中寻找,而我不知道它有多实用。 AbstractLexer有点奇怪。


编辑:最简单的方法是将语法保持为LL(1)格式。一种方法是在Values内移动括号:

Values ::= "(" [Array | Value {"," Value}* [","] ] ")"

答案 1 :(得分:2)

要在最后添加可选的逗号,我们可以使用[]表示法:

Annotation     ::= "@" AnnotationName ["(" [Values] ")"]
Values ::= Array | Value {"," Value}* [","]