2016-04-03 7 views
0

Ich versuche, einen Interpreter mit Prolog zu erstellen, und ich bin fertig mit Parser machen, aber ich bin stecken und nicht bekommen, wie man Symboltabelle für die gleiche machen. Die Ausgabe für meine Parser ist wieSymboltabelle in Prolog

Result = [[["int", "add"], "(", [["int", "a"], [",", [[...|...]|...]]], ")", "=", [["a"|...], [...|...]]], [[["int", "letin"], "(", [["int", "a"], []], ")", "=", [...|...]], [[["int", "equal"], "(", [[...|...]|...], ")"|...], [[["int"|...], "("|...], []]]]] 

ich versuche mit Zuordnungsliste für die gleichen, aber keine Ahnung, wie es weitergeht ..... nur ein Überblick wird sehr hilfreich sein.

+0

Könnten Sie bitte einrücken Code richtig:

Um das Beispiel auf die Daten, die Sie gezeigt haben, Symbol/1 kann vereinfacht werden, anpassen? Setze 4 Leerzeichen vor jede Codezeile und sieh die Magie. – surajsn

+0

Ich habe keinen Code geschrieben, es ist nur eine Ausgabe von meinem Parser. –

+0

Dann einrücken Sie es richtig ein. – surajsn

Antwort

0

Die einfachste mögliche Symbole Tabelle:

symtable_lookup(Sym, ST_Current, ST_Update) :- 
    member(Sym, ST_Current) -> ST_Update = ST_Current ; ST_Update = [Sym|ST_Current]. 

Ein Symbol ist ein solches allgemeines Konzept, nur absichtlich ein funktionierendes Beispiel hier einige vorläufige zu geben:

symbol(S) :- 
    atom(S), atom_codes(S, Cs), forall(member(C,Cs), code_type(C,alpha)). 

Ein Symbol soll ein sein Atom, das nur specified Zeichencodes enthält.

Um Symbole aus einer beliebigen Liste zu filtern:

list_symbols(L, Symbols) :- 
    include(symbol, L, Symbols). 

schließlich ein Test:

?- L=[a,+,b,-,a],list_symbols(L,S),foldl(symtable_lookup,S,[],Final). 
L = [a, +, b, -, a], 
S = [a, b, a], 
Final = [b, a]. 

Wir brauchen foldl weil Prolog - ähnlich wie rein funktionale Sprachen - unveränderlich (einmal zuweisen) hat Variablen .

symbol(S) :- 
    forall(member(C, S), code_type(C, alpha)).