0

是否可以将从文本文件中检索到的终端附加到 Rascal 中的词典中?这会在运行时发生,我看不出有明显的方法来实现这一点。我宁愿将数据与 Rascal 项目分开。例如,如果我从文本文件中读取了国家列表,我将如何将这些添加到词典中(使用lexical关键字)?

4

2 回答 2

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,所以万岁。当然,您可以使用这种过滤进行有趣的复杂推导。人们有时会编写模棱两可的语法并使用类似的过滤器来使其明确。

如果过滤函数在摊销常数时间内,那么以这种方式解析和过滤就输入长度而言是三次最坏情况时间。如果语法是线性的,那么整个过程当然也是线性的。

于 2017-02-13T17:18:58.837 回答
0

一个完全不同的答案是动态更新语法并从中生成解析器。这涉及对 Rascal 的内部语法表示进行处理,如下所示:

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");
}

现在写完这些,有两件事:

  • 我认为这可能会触发未知错误,因为我们没有测试动态解析器​​生成,并且
  • 对于具有合理大小的词典,这将生成一个非常慢的解析器,因为解析器针对编程语言中的关键字而不是大型词典进行了优化。
于 2017-02-13T17:31:08.597 回答