在Prolog中读取反斜杠时出现问题

时间:2010-05-15 20:36:13

标签: prolog escaping

我在Prolog中写了一个词法分析器,它将被用作功能语言解释器的一部分。语言规范允许出现例如let \x = x + 2;之类的表达式。我希望lexer为这样的输入做的是“返回”:

[tokLet, tokLambda, tokVar(x), tokEq, tokVar(x), tokPlus, tokNumber(2), tokSColon] 

问题是,Prolog似乎忽略了\字符,并且“返回”上面写的行,除了tokLambda

解决这个问题的一种方法是以某种方式在程序代码中每次出现之前/之后添加第二个反斜杠(因为如果我将原始输入更改为let \\x = x + 2;,一切正常)但我不是真的喜欢它。

有什么想法吗?

编辑: 如果有人有类似的问题,我就是这样解决的:

main(File) :-
  open(File,read,Stream),
  read_stream_to_codes(Stream, Codes),
  lexer(X,Codes,[]),
    ... invoke other methods

1 个答案:

答案 0 :(得分:1)

你从哪里得到字符串let \x = x + 2;

  • 如果它在您的Prolog程序中:是的,您必须加倍反斜杠。
  • 如果是来自外部文件:你怎么从那里读取它?也许这个谓词特意解释反斜杠。

我受到了这个问题的启发,并编写了一些代码,这些代码应该可以移植到所有Prolog实现中:

% readline(-Line)
%
% Reads one line from the current input. The line is then returned as a list
% of one-character atoms, excluding the newline character.
% The returned line doesn't tell you whether the end of input has been reached
% or not.
readline(Line) :-
    'readline:read'([], Reversed),
    reverse(Line, Reversed).

'readline:read'(Current, Out) :-
    get_char(C), 'readline:append'(C, Current, Out).

'readline:append'(-1, Current, Current) :- !.
'readline:append'('\n', Current, Current) :- !.
'readline:append'(C, Current, Line) :-
    'readline:read'([C | Current], Line).

我试过了,它对我有用。

当然,正如问题1846199中所述,您也可以使用read_line_to_codes/2