无法解析Peg.js解析器中的分隔符

时间:2017-03-08 14:32:36

标签: peg pegjs

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

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

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

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

你怎么解析它?

方法:搜索连续的; 即从首次=搜索连续;,然后将=和最后;之间的文字视为值。

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

例如,此操作失败:token=crbz23;4=134;

有什么建议吗?

1 个答案:

答案 0 :(得分: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
   ]
]