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

在Prolog中读取反斜杠时出现问题,prolog,escaping,Prolog,Escaping,我正在用Prolog编写一个lexer,它将用作函数式语言解释器的一部分。语言规范允许这样的表达式,例如let\x=x+2将发生。我希望lexer为此类输入所做的是“返回”: 问题是,Prolog似乎忽略了\字符,并“返回”上面写的行,除了tokLambda 解决这个问题的一种方法是在程序代码中每次出现反斜杠之前/之后添加第二个反斜杠(因为如果我将原始输入更改为let\\x=x+2;,一切都会正常工作),但我并不喜欢它 有什么想法吗 编辑: 如果有人有类似的问题,我就是这样解决的: main(F

我正在用Prolog编写一个lexer,它将用作函数式语言解释器的一部分。语言规范允许这样的表达式,例如
let\x=x+2将发生。我希望lexer为此类输入所做的是“返回”:

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

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

有什么想法吗

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

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

你从哪里得到字符串
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).
我试过了,它对我有效


当然,如前所述,您也可以使用
read_line_to_code/2

我通过执行swi prolog控制台中的
?-lexer(X,“let\X a”,[])等方法获得字符串。
。我现在正试图从文件中读取它。您能告诉我您的代码应该做什么,以便我可以尝试在swi 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).