我正在尝试使用Prolog构建一个解释器,我已经完成了解析器,但我陷入了困境,并没有得到如何制作符号表。我的解析器的输出就像
Result = [[["int", "add"], "(", [["int", "a"], [",", [[...|...]|...]]], ")", "=", [["a"|...], [...|...]]], [[["int", "letin"], "(", [["int", "a"], []], ")", "=", [...|...]], [[["int", "equal"], "(", [[...|...]|...], ")"|...], [[["int"|...], "("|...], []]]]]
我正在尝试使用关联列表,但不知道如何继续.....只是概述将是非常有帮助的。
答案 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)).