2017-03-08 100 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 
    ] 
]