2017-03-08 67 views
1

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

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

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

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

你怎么分析呢?

方法:搜索从第一=搜索连续;连续;的 即再考虑=和最后;之间的文本作为值。

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

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

有什么建议?

回答

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 
    ] 
]