所以Doctrine注释基于JSON,但由于PHP数组允许悬空逗号,Drupal人很习惯这一点,说实话,编辑起来要容易得多
(
"foo" => "bar",
"foo1" => "bar1",
)
这样可以切换行,添加另一行等,而不是bar1之后的逗号丢失。
所以我试图patch学说允许这样做。维护者声称
您通过检查不属于“值”的标记来混合语法规则,但是它的父标记“注释”。
他是对的。所以,我们正在寻找更好的语法。
Annotation ::= "@" AnnotationName ["(" [Values] ")"]
Values ::= Array | Value {"," Value}*
如何在值中允许使用尾随逗号?
答案 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}* [","]