在Rascal中處理複雜文字的最佳做法是什麼?從JavaScript(我的DSL也有類似的情況下)在Rascal中處理複雜詞彙
兩個例子:
- 絃樂與
\
逃逸 - 必須轉義成實際值。 - 正則表達式文字 - 需要自己的子AST。
implode
拒絕的詞彙映射到抽象的樹木,他們顯然handed differently從語法生產,儘管有完整的解析樹可用。例如,下面的解析失敗,IllegalArgument("Missing lexical constructor")
:
module lexicals
import Prelude;
lexical Char = "\\" ![] | ![\\]; // potentially escaped character
lexical String = "\"" Char* "\""; // if I make this "syntax", implode works as expected
start syntax Expr = string: String;
data EXPR = string(list[str] chars);
void main(list[str] args) {
str text = "\"Hello\\nworld\"";
print(implode(#EXPR, parse(#Expr, text)));
}
我至今唯一的想法是使用單獨定義的語法,而不佈局空白來捕獲所有的詞彙用原始字符串並在稍後重新解析它們(破滅和所有) 。希望有更好的方法。
標註「string:」與現有構造函數衝突。用別的標籤(「string1:」)導致「找不到EXPR的構造函數」。 (我的後綴錯誤與我的實際定義有很大關係,使用版本0.7.2.201501130937)我的AST非常接近語法(這是一個典型的「Expr」語法),但我需要應用大量的術語重寫(規範化和優化),這就是爲什麼我首先使用Rascal:這是一種簡單但實用的語言,它既內置瞭解析和重寫。 –
我認爲這可以通過將它們分成兩個模塊來解決。事實上,流氓是解析和重寫的一種非常好的語言。並且在某種程度上,這也可以在解析樹上進行。 –
將步驟implode和手動將解析樹映射到「核心語言」可能比解析詞法更好,我會繼續。討論:我理解在具體語法(TXL粉絲在這裏)工作背後的想法,但是真正令人遺憾的是,Rascal正在朝着這個方向發展。不可變的數據和內置的回溯('失敗')使其成爲經典的「AST構建動作解析器」方法的理想宿主。輕量級的樹型構建語法(一個ANTLR 3)+帶佈局數據(空白和註釋)的自動裝飾+自動解析...可以做夢。 –