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