Wie man einen Parser schaffen, die aus einer Datei genommen eine Liste von Wörtern tokenizes?

StackOverflow https://stackoverflow.com/questions/3121230

Frage

Ich versuche, eine Syntax Text Korrektor für meine Compiler Klasse zu tun. Die Idee ist. Ich habe einige Regeln, die der Sprache inhärent sind (in meinem Fall, Portugiesisch), wie „Ein gültiger Ausdruck Subjekt Verb Adjektiv ist“, wie in „Ruby ist groß“

Ok, also zuerst muss ich tokenize den Eingang „Ruby ist groß“. Also habe ich eine Textdatei „Verben“ habe, mit vielen Verben, einer Zeile. Dann habe ich einen Text "Adjektive", ein "Pronomen", etc.

Ich versuche Ragel zu verwenden, um einen Parser zu erstellen, aber ich weiß nicht, wie ich etwas tun könnte, wie:

%%{
  machine test;
  subject = <open-the-subjects-file-and-accept-each-one-of-them>;
  verb = <open-the-verbs-file-and-accept-each-one-of-them>;
  adjective = <open-the-adjective-file-and-accept-each-one-of-them>;
  main = subject verb adjective @ { print "Valid phrase!" } ;
}%%

Ich schaute auf ANTLR, Lex / Yacc, Ragel, etc. Aber konnte man nicht finden, dieses Problem zu lösen schien. Der einzige Weg, dies zu tun, dass ich war zu Vorprozess Ragel der Eingabedatei denken konnte, so dass mein Programm die Datei liest und schreibt seinen Inhalt an der richtigen Stelle. Aber ich weiß nicht, wie diese Lösung auch nicht.

Hat jemand weiß, wie ich dies tun könnte? Es gibt kein Problem, wenn es nicht mit Ragel ist, ich will nur dieses Problem lösen. Ich möchte Rubin- oder Python verwenden, aber das ist nicht wirklich notwendig, entweder.

Danke.

War es hilfreich?

Lösung

Wenn Sie die Dateien während der Kompilierung lesen wollen .. machen sie das Format sein:

subject = \
ruby|\
python|\
c++

dann die Nutzung ragel 'enthalten' oder 'Import' Aussage (I vergessen, welche .. muß das Handbuch) zu importieren.


Wenn Sie die Liste der Themen zur Laufzeit überprüfen möchten, vielleicht auch nur ragel 3 Wörter machen lesen, haben dann eine Aktion mit jedem Wort verbunden. Die Aktion kann die Datei lesen und Nachschlagen, wenn das Wort gut ist oder nicht zur Laufzeit ist.

Die Aktion liest die Textdatei und vergleicht den Inhalt des Wortes.

%%{
machine test

action startWord {
    lastWordStart = p;
}
action checkSubject {
   word = input[lastWordStart:p+1]  
   for possible in open('subjects.txt'):
       if possible == word:
           fgoto verb
   # If we get here do whatever ragel does to go to an error or just raise a python exception 
   raise Exception("Invalid subject '%s'" % word)
}
action checkVerb { .. exercise for reader .. ;) }
action checkAdjective { .. put adjective checking code here .. }

subject = ws*.(alnum*)>startWord%checkSubject
verb := : ws*.(alnum*)>startWord%checkVerb
adjective := ws*.)alnum*)>startWord%checkAdjective
main := subject;
}%%

Andere Tipps

Mit Bison ich die Lexer von Hand schreiben würde, welche die Worte Nachschlag in dem vordefinierten Wörterbuch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top