如何修复Prolog中的‘当前或前序运算符需加括号’语法错误?
解决Prolog语法错误:current or previous operator needs brackets
你的代码触发语法错误的核心原因是条件分支中逗号与->操作符的优先级冲突。在Prolog的语法规则里,逗号(,)的优先级低于->,这会导致atom_chars(Word, [H|T]), char_type(H, alpha) -> Token = id(Word)被错误解析,进而触发"操作符需要括号"的报错。
以下是修正后的完整代码:
convert_to_tokens([Word|Rest], [Token|RestTokens]) :- atom_string(Atom, Word), ( Atom == '+' -> Token = pl ; Atom == '-' -> Token = mi ; Atom == '*' -> Token = ti ; Atom == '/' -> Token = di ; number_string(Number, Word) -> Token = Number ; (atom_chars(Word, [H|T]), char_type(H, alpha)) -> Token = id(Word) ; Token = Atom ), convert_to_tokens(Rest, RestTokens). convert_to_tokens([], []).
关键修正点:
- 给包含逗号的条件
atom_chars(Word, [H|T]), char_type(H, alpha)加上括号,确保这两个目标作为一个整体参与->的条件判断,避免优先级解析错误。 - 补充了递归终止子句
convert_to_tokens([], []).,原代码缺少该子句会导致递归无法结束,运行时会出现栈溢出问题。
另外说明:你代码中Atom == '+'这类写法是正确的,单引号已经将操作符包裹为原子,不需要额外调整。
内容的提问来源于stack exchange,提问作者Madi92998
相关产品推荐
相关产品推荐

