2016-04-03 32 views
0

Prolog kullanarak bir yorumlayıcı oluşturmaya çalışıyorum ve ayrıştırıcı yapmakla işim bitti, ancak takılıp kaldım ve aynı şekilde sembol tablosunu nasıl yapacağımı anlamıyorum. Aynı için dernek listesini kullanarak çalışıyor ama nasıl devam etmek bir fikrin olmamasından ..... sadece bir bakış gerçekten yararlı olacaktır am Prolog sembolü tablo

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

gibi benim ayrıştırıcı için çıkıştır.

olabildiğince basit semboller tablosu
+0

kodunuzu düzgün girinti misiniz:

Eğer sembol/1 basitleştirilmiş olabilir göstermiştir verilere örnek uyarlamak için mi? Her kod satırından 4 tane beyaz boşluk koyup büyüyü görün. – surajsn

+0

Hiçbir kod yazmamıştım, sadece ayrıştırıcımdan bir çıktı. –

+0

Ardından doğru şekilde girintilendirin. – surajsn

cevap

0

:

bir sembol sadece burada çalışan bir örnek vermek için bilerek, böyle bir genel kavramdır
symtable_lookup(Sym, ST_Current, ST_Update) :- 
    member(Sym, ST_Current) -> ST_Update = ST_Current ; ST_Update = [Sym|ST_Current]. 

olan bazı ön:

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

sembolü olacaktır bir Sadece specified karakter kodlarını içeren atom.

keyfi bir listeden sembolleri filtrelemek için: Nihayet
list_symbols(L, Symbols) :- 
    include(symbol, L, Symbols). 

, bir 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]. 

Biz Prolog çünkü foldl gerek - benzer salt işlevsel diller - değişmez sahiptir (bir kez atama) değişkenleri .

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