我有一个我正在尝试构建的词法分析器。我只是想知道它为什么不创建第二个列表。
%TokenList=[int, add, '(', int, a, ',', int, b, ')'].
lexer([H|TokenList],Output,[Output|X2]):-
lexer_test(H,Output),lexer(TokenList,Output,X2).
lexer_test(H,Output):-
(
H = '\'int\'' -> Output = 'TYPE_INT'
;(H = '\'bool\'' -> Output='TYPE_BOOL'
;(H = '\',\'' -> Output='COMMA'
;(H = '\'=\'' -> Output='ASSIGN'
;(H = '\'let\'' -> Output='LET'
;(H = '\'in\'' -> Output='LET_IN'
;(H = '\'if\'' -> Output='COND_IF'
;(H = '\'then\'' -> Output='COND_THEN'
;(H = '\'else\'' -> Output='COND_ELSE'
;(H = '\'==\'' -> Output='LOGIC_EQ'
;(H = '\'!=\'' -> Output='LOGIC_NOT_EQ'
;(H = '\'>\'' -> Output='LOGIC_GT'
;(H = '\'>=\'' -> Output='LOGIC_GTEQ'
;(H = '\'+\'' -> Output='ARITH_ADD'
;(H = '\'-\'' -> Output='ARITH_SUB'
;(H = '\'(\'' -> Output='OPEN_P'
;(H = '\')\'' -> Output='CLOSE_P'
;(H = '\'0\'' -> Output='INTEGER'
;(H = '\'1\'' -> Output='INTEGER'
;(H = '\'2\'' -> Output='INTEGER'
;(H = '\'3\'' -> Output='INTEGER'
;(H = '\'4\'' -> Output='INTEGER'
;(H = '\'5\'' -> Output='INTEGER'
;(H = '\'6\'' -> Output='INTEGER'
;(H = '\'7\'' -> Output='INTEGER'
;(H = '\'8\'' -> Output='INTEGER'
;(H = '\'9\'' -> Output='INTEGER'
;(Output='IDENTIFIER'
)))))))))))))))))))))))))))).
不要担心第二个函数lexer_test。我可以解决这个问题。但我真的不知道为什么我没有得到输出列表。如果我能制作lexer / 2而不是lexer / 3那就太棒了。如果你能提出一些好的阅读来学习prolog,请告诉我。感谢。
答案 0 :(得分:1)
目前,您没有指定终止条件:
lexer([H|TokenList],Output,[Output|X2]):-
lexer_test(H,Output),lexer(TokenList,Output,X2).
Lexer一直在调用自己(递归),但是你没有指定其他子句,因此Prolog最终会进入无限循环。您正在寻找的条件是:
lexer([],_,[]).
作为停止条件。这表明令牌列表变空的条件。
开始学习prolog(imho)的好地方是: http://www.learnprolognow.org/