我在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
答案 0 :(得分:1)
你从哪里得到字符串let \x = x + 2;
?
我受到了这个问题的启发,并编写了一些代码,这些代码应该可以移植到所有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
。