所以教义注释是基于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}* [","]