2017-02-13 5 views
0

テキストファイルから取得した端末をRascalの辞書に追加することはできますか?これは実行時に発生し、これを達成するための明白な方法はありません。私はむしろデータをRascalプロジェクトとは別に保管しています。たとえば、テキストファイルから国のリストを読み込んだ場合、これらを辞書に追加するにはどうすればよいですか(lexicalキーワードを使用します)。テキストファイルをRascalの辞書に追加する

答えて

1

データ依存バージョンのRascalパーサーでは、これはさらに簡単で高速ですが、まだリリースされていません。今の私はそうのように、ポスト解析フィルタで、一般的なルールを記述します:filter機能がhelloのために可能なすべての導出を削除

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> 

ので、パーサは、最終的にhelloにパースエラーが返されます。それは辞書に入っているaapのためにそうしていません。もちろん、この種のフィルタリングを使って、面白く複雑な派生を行うことができます。人々はあいまいでない文法を書くことがあります。

フィルタリング関数が償却された一定時間内にある場合、このように解析およびフィルタリングは入力の長さに関して立方最悪ケース時間で行われます。文法が線形の場合、もちろんプロセス全体も線形です。

+0

データ依存バージョンにアクセスすることができますか? – rien333

+0

明確な考えはありません。悪ふざんなプロジェクトには大きなバックログがあり、我々は現在他の優先事項に取り組んでいます。 – jurgenv

+1

あなたはデータの依存関係を解析するために、イグアナまたはマイアカットを試すことができます(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); 

このニュータイプは、辞書の定義について具体化文法+型であり、これは今では同じように使用することができる。

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

は今、アルにこれを書かれた、二つのこと:

  • 私たちは、動的パーサ生成をテストしていないので、これは未知のバグを誘発するかもしれないと思う、と
  • 合理的なサイズのレキシコンでは、パーサはプログラミング言語のキーワードに最適化されており、大きなレキシコンではないため完全に遅いパーサを生成します。
関連する問題