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


Amend JSON - based grammar to allow for trailing comma

所以教义注释是基于JSON的,但由于PHP数组允许悬空逗号Drupal人已经习惯了这一点,说实话,编辑起来要容易得多。

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

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

所以我试图修补教义以允许这一点。维护者声称

您通过检查不属于"值"而是其父级"注释"的标记来混合语法规则。

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

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

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

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

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

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


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

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

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

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