1

我正在学习如何使用 peg.js 编写解析器并遇到了一个独特的问题。我;用作分隔符来对键值对中的字符串进行分类。

示例:如果要解析的字符串是name=prabesh;city=Bangalore. 我的解析器目前将name其作为键和prabesh值,city作为键和bangalore值。

问题是如果分隔符是字符串的一部分怎么办?

例如:city=bangalore;address=#12/1;santacruz

你怎么能解析它?

方法:搜索连续;的,即从第一次=搜索连续;的,然后将介于=和最后的文本;视为一个值。

这种方法的问题是,如果值本身有一个,=那么解析器将无法正确解析它。

例如,这会失败:token=crbz23;4=134;

有什么建议么?

4

1 回答 1

1

使用 PEG 语法,您需要具体说明您不想匹配的内容。在您的示例中,如果遇到分号,您可能希望前瞻与新键不匹配。解决此问题的常见 PEG 习语如下所示:(!(id) .)+. 这是使用您的输入的示例:

start =
    exp+

exp =
    key '=' val ';'?

key =
    $([a-z]+)

val =
    $((!(';' key '=') .)+)

输入:

city=bangalore;address=#12/1;santacruz

输出:

[
   [
      "city",
      "=",
      "bangalore",
      ";"
   ],
   [
      "address",
      "=",
      "#12/1;santacruz",
      null
   ]
]
于 2017-04-28T14:08:20.850 回答