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,但我现在不使用它,因为我可以看到我在理解差异列表时遇到问题。所以,欢迎您在这种情况下说出我的代码。
提前致谢:)
答案 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].