Prolog中的符号表

时间:2016-04-03 04:11:20

标签: prolog symbols

我正在尝试使用Prolog构建一个解释器,我已经完成了解析器,但我陷入了困境,并没有得到如何制作符号表。我的解析器的输出就像

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

我正在尝试使用关联列表,但不知道如何继续.....只是概述将是非常有帮助的。

1 个答案:

答案 0 :(得分: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,因为Prolog - 与纯函数式语言类似 - 具有不可变(赋值一次)变量。

要使示例适应您显示的数据,可以简化符号/ 1:

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