2017-02-13 20 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"); 
} 

现在已经写人本,两件事情:

  • 我想,这可能会引发未知的错误,因为我们没有测试动态分析器生成,
  • 对于具有合理大小的词典,由于解析器针对编程语言中的关键字进行了优化,而不是大型词典,因此这将生成极慢的解析器。