2016-04-03 10 views
0

私はPrologを使用してインタープリタを作成しようとしています。パーサを作成していますが、固執していて、同じもののシンボルテーブルを作成する方法が得られません。私は同じのための連想リストを使用しようとしていますが、.....ちょうど概要を進めるためにどのように任意のアイデアを持っていないことは本当に参考になります Prologのシンボルテーブル

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

ように私のパーサの出力があります。

+0

をあなたは正しくコードをインデントしてくださいもらえますか?すべてのコード行の前に4つの空白を置き、魔法を見てください。 – surajsn

+0

私はコードを書いていません。パーサからの出力です。 –

+0

これを正しくインデントします。 – surajsn

答えて

0

最も簡単なシンボルテーブル:

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

シンボルはここで働くの例を与えることだけを目的に、一般的な概念であり、いくつかの予備です:

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

記号はしなければなりません文字はspecified文字コードのみを含む。任意のリストからシンボルをフィルタリングするに

:最後に

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

、テスト:

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

プロローグので、我々はfoldlを必要とする - 純粋関数型言語に似ては - 不変(一度割り当て)の変数を持っています。あなたが示されているデータに例を適応する

、シンボル/ 1を簡略化することができます。

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