2016-02-12 69 views
1

我正在使用PegKit來構建一個簡單的域特定解釋型語言。PegKit字符串插值

我基本上擁有除插值字符串以外的所有工作。

的想法是爲了實現某種規則是這樣的:

atom = Number | stringLiteral | referenceType; 
stringLiteral = "'"! (~"'" | "{"! expression "}"!)* "'"!; 
referenceType = Word ('.' Word)*; 

在「表達」生產已定義。

我在這裏插入了一些邏輯,從我需要的標記中建立一個字符串。如果我們遇到一個表達式,我會對它進行評估並將其添加到正在構建的字符串中。

原子和參考類型的製作完美解析。

但是,如果我嘗試解析類似'你好'的東西,當原子規則運行時,產生的令牌總是內置的Word類型。

我試過用美元符號和其他字符組合代替單引號來表示字符串的開始和結尾,但它永遠不會匹配。

任何想法?

Cheers

回答

0

PEGKit的創建者在這裏。

您確定生產的錯誤'hello'令牌類型爲Word?我懷疑他們實際上可能是QuotedString ...... PKTokenizer的默認行爲是爲任何單引號或雙引號字符串生成一個QuotedString標記。

要達到您要查找的結果,您必須更改撇號(單引號)的tokenizerStatePKTokenizer。默認情況下,這是PKQuoteState,但您需要將其更改爲PKSymbolState(tokenizers -symbolState屬性),以便將撇號識別爲類型爲Symbol的單字符標記,而不是類型爲QuotedString的多字符標記的開頭。

你可以在你的語法(或任何你要配置你的分詞器)的頂部在行動做到這一點:

@before { 
    PKTokenizer t = self.tokenizer; 
    [t setTokenizerState:t.symbolState from:'\'' to:'\'']; 
} 

現在撇號將被標記化單字符Symbol令牌。

+0

謝謝託德!這似乎解決了我的問題。 –