2017-02-13 2 views
0

Ist es möglich, Terminals aus einer Textdatei zu einem Lexikon in Rascal abgerufen anhängen? Dies würde zur Laufzeit passieren, und ich sehe keinen offensichtlichen Weg, dies zu erreichen. Ich würde die Daten lieber vom Rascal-Projekt trennen. Wenn ich zum Beispiel eine Liste von Ländern aus einer Textdatei gelesen hätte, wie würde ich diese zu einem Lexikon hinzufügen (mit dem Schlüsselwort lexical)?Anfügen Textdatei in Rascal Lexikon

Antwort

1

In der datenabhängigen Version des Rascal Parsers dieser ist noch einfacher und schneller, aber wir haben das noch nicht veröffentlicht worden. Denn jetzt würde ich eine allgemeine Regel mit einem Post-Parse-Filter schreiben, etwa so:

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> 

Da die filter Funktion alle möglichen Ableitungen für hello entfernt, der Parser liefert schließlich einen Parse-Fehler auf hello. Es tut dies nicht für aap, die im Lexikon ist, also hurra. Mit dieser Art der Filterung können Sie natürlich interessante Ableitungen machen. Menschen schreiben manchmal mehrdeutige Grammatiken und verwenden Filter wie diese, um sie eindeutig zu machen.

Parsing und Filterung auf diese Weise ist in Kubikzeit worst-case in Bezug auf die Länge der Eingabe, wenn die Filterfunktion in den fortgeführten Anschaffungs konstante Zeit ist. Wenn die Grammatik linear ist, dann ist natürlich auch der gesamte Prozess linear.

+0

Jede Idee, wenn die datenabhängige Version zugänglich ist? – rien333

+0

Keine klare Idee. Es gibt einen großen Rückstand auf das Schurkenprojekt und wir arbeiten jetzt an anderen Prioritäten. – jurgenv

+1

Sie könnten versuchen, Leguan oder Erdmännchen, für die Analyse mit Datenabhängigkeit, siehe Github. – jurgenv

0

Eine ganz andere Antwort wäre, dynamisch die Grammatik zu aktualisieren und einen Parser daraus zu generieren. Dabei geht es gegen die innere Grammatik Darstellung von Rascal arbeiten wie folgt:

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

Diese Newtype ist eine verdinglichte Grammatik + Art für die Definition des Lexikons, und die nun wie so verwendet werden:

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

Nun al geschrieben zu haben diese zwei Dinge:

  • ich denke, das unbekannte Fehler auslösen können, da wir nicht dynamisch Parsergenerierung testen haben, und
  • Für ein Lexikon mit einer vernünftigen Größe erzeugt dies einen äußerst langsamen Parser, da der Parser für Schlüsselwörter in Programmiersprachen und nicht für große Lexika optimiert ist.
Verwandte Themen