2016-11-23 38 views
0

我該如何創建一個分析器,以允許字符恰好與開始/結束字符相同。使用以下示例:我將如何創建一個分析器,該分析器使用的字符也在開頭和結尾

'Isn't it hot' 

第二個單引號應該被接受爲開始和結束單引號之間內容的一部分。我創造了這樣的解析器:

char("'").seq((word()|char("'")|whitespace()).plus()).seq(char("'")) 

,但它失敗:

Failure[1:15]: "'" expected 

如果我使用「任何()|字符(」「」),那麼它貪婪地佔用結束單引號引起錯誤也是如此。

會我需要創建一個實際的語法課?我試圖創建一個,但無法弄清楚如何使一個解析器不會嘗試貪婪地消耗結束標誌。

+0

我想說,這個問題的一般解決方案是要求在中間引用單引號。請參閱c#的逐字字符串語法實例:https://msdn.microsoft.com/en-us/library/aa691090(v=vs.71).aspx –

回答

2

問題是plus()是貪婪和盲目的。這意味着重複會消耗盡可能多的輸入,但不會考慮事後發生的情況。在你的例子中,直到輸入結尾的所有東西都被消耗掉了,但是這個序列中的最後一個引用不能再匹配了。

您可以通過使用無盲區變化plusGreedy(Parser),而不是解決問題:

char("'") 
    .seq((word() | char("'") | whitespace()).plusGreedy(char("'"))) 
    .seq(char("'")); 

這隻要還有一個char("'")左側,可以事後被消耗消耗輸入。

相關問題