Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 修改基于JSON的语法以允许尾随逗号_Php_Json_Doctrine Orm_Bnf - Fatal编程技术网

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

Php 修改基于JSON的语法以允许尾随逗号,php,json,doctrine-orm,bnf,Php,Json,Doctrine Orm,Bnf,所以条令注释是基于JSON的,但由于PHP数组允许挂起逗号,Drupal的人对此已经习以为常,老实说,编辑起来要容易得多 ( "foo" => "bar", "foo1" => "bar1", ) 因此,如果bar1后面的逗号丢失,则可以切换行,添加另一行等 所以,我正试图从教义上考虑这一点。维护者声称 通过检查不是“值”的一部分,而是其父项“注释”的标记,可以混合语法规则 他是对的。因此,我们正在寻找更好的语法 Annotation ::= "@" Annotat

所以条令注释是基于JSON的,但由于PHP数组允许挂起逗号,Drupal的人对此已经习以为常,老实说,编辑起来要容易得多

(
  "foo" => "bar",
  "foo1" => "bar1",
)
因此,如果bar1后面的逗号丢失,则可以切换行,添加另一行等

所以,我正试图从教义上考虑这一点。维护者声称

通过检查不是“值”的一部分,而是其父项“注释”的标记,可以混合语法规则

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

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

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

要在末尾添加可选逗号,我们可以使用[]符号:

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

要在末尾添加可选逗号,我们可以使用[]符号:

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

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

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

这需要能够在lexer中查找,我不知道它有多实用
AbstractLexer
有点奇怪


编辑:最简单的方法是将语法保持为LL(1)形式。一种方法是将括号移到值中:

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

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

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

这需要能够在lexer中查找,我不知道它有多实用
AbstractLexer
有点奇怪


编辑:最简单的方法是将语法保持为LL(1)形式。一种方法是将括号移到值中:

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