在Prolog中简单表达的解析器

时间:2016-06-04 14:49:48

标签: prolog

parseExp( ExpToParse, Op(Operand1, Operand2)) :-
    operand(ExpToParse, Diff, Operand1),
    operator(Diff, Diff2, Op),
    operand(Diff2, _, Operand2).

operand([H|L], L, H).
operator(['+'|R], R, add).
operator(['-'|R], R, sub).
operator(['*'|R], R, mul).
operator(['/'|R], R, div).

我正在尝试为简单表达式实现解析器,我的意思是:2 + 4等。

但是,我在第一行得到了编译器错误:

Syntax error: Operator expected

我无法理解。我希望第一个术语的第二个参数(Operator(Operand1, Operand2))将统一到add( 2, 4)。我的意思是:

parseExp( [2, '+', 4] , X ). ?- X = add(2,4)

我没有说明为什么编译器有问题。

第二个问题:

我知道DCG,但我现在不使用它,因为我可以看到我在理解差异列表时遇到问题。所以,欢迎您在这种情况下说出我的代码。

提前致谢:)

1 个答案:

答案 0 :(得分:1)

不允许像以下一样写Op(Operand1, Operand2)

parseExp( ExpToParse, Op(Operand1, Operand2)) :- 
  ...

相反,请使用:

parseExp( ExpToParse, RES) :- 
  ...,
  RES =.. [ Op, Operand1, Operand2 ]

在您的示例中,这意味着将代码更改为:

parseExp( ExpToParse, RES ) :-
    operand(ExpToParse, Diff, Operand1),
    operator(Diff, Diff2, Op),
    operand(Diff2, _, Operand2),
    RES =.. [Op,Operand1, Operand2].