2017-02-13 42 views
0

是否可以將從文本文件檢索到的終端追加到Rascal中的詞典中?這會在運行時發生,我看不出有什麼明顯的方式來實現這一點。我寧願將數據與Rascal項目分開。例如,如果我從文本文件中讀取了國家/地區列表,我如何將它們添加到詞典(使用關鍵字lexical)?將文本文件附加到Rascal中的詞典

回答

1

在數據相關版本的Rascal解析器中,這更容易和更快,但我們還沒有發佈。現在我會寫一個通用的規則與解析後的過濾器,像這樣:

rascal>set[str] lexicon = {"aap", "noot", "mies"}; 
set[str]: {"noot","mies","aap"} 
rascal>lexical Word = [a-z]+; 
ok 
rascal>syntax LexiconWord = word: Word w; 
ok 
rascal>LexiconWord word(Word w) { // called when the LexiconWord.word rule is use to build a tree 
>>>>>>> if ("<w>" notin lexicon) 
>>>>>>> filter; // remove this parse tree 
>>>>>>> else fail; // just build the tree 
>>>>>>>} 
rascal>[Sentence] "hello" 
|prompt:///|(0,18,<1,0>,<1,18>): ParseError(|prompt:///|(0,18,<1,0>,<1,18>)) 
     at $root$(|prompt:///|(0,64,<1,0>,<1,64>)) 
rascal>[Sentence] "aap" 
Sentence: (Sentence) `aap` 
rascal> 

因爲filter功能去掉了所有可能的派生爲hello,解析器最終返回上hello解析錯誤。它不適用於詞庫中的aap,因此歡呼。當然,你可以用這種過濾方式做出有趣複雜的派生。人們有時會寫出含糊不清的語法,並使用像這樣的過濾器來使其明確無誤。

如果濾波函數處於攤銷常量時間,則以這種方式進行解析和過濾,就輸入長度而言,以立方最壞情況時間爲單位。如果語法是線性的,那麼整個過程當然也是線性的。

+0

何時可以訪問數據相關版本? – rien333

+0

不清楚的想法。這個流氓項目有大量積壓,我們現在正在處理其他優先事項。 – jurgenv

+1

雖然你可以嘗試iguana或meerkat解析與數據依賴,請參閱github。 – jurgenv

0

完全不同的答案是動態更新語法並從中生成解析器。這涉及到對流氓的內部語法表示像這樣工作:

set[str] lexicon = {"aap", "noot", "mies"}; 
syntax Word = ; // empty definition 
typ = #Word; 
grammar = typ.definitions; 
grammar[sort("Word")] = { prod(sort("Word"), lit(x), {}) | x <- lexicon }; 
newTyp = type(sort("Word"), grammar); 

這NEWTYPE是一個具體化的語法+型的詞彙的定義,並且其現在可以使用像這樣:

import ParseTree; 
if (type[Word] staticGrammar := newType) { 
    parse(staticGrammar, "aap"); 
} 

現在已經寫人本,兩件事情:

  • 我想,這可能會引發未知的錯誤,因爲我們沒有測試動態分析器生成,
  • 對於具有合理大小的詞典,由於解析器針對編程語言中的關鍵字進行了優化,而不是大型詞典,因此這將生成極慢的解析器。