Prolog lexer无法找到错误

时间:2016-03-17 15:36:32

标签: prolog

我有一个我正在尝试构建的词法分析器。我只是想知道它为什么不创建第二个列表。

%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,请告诉我。感谢。

1 个答案:

答案 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/