2010-05-15 37 views
2

我在Prolog中編寫了一個詞法分析器,它將用作函數式語言解釋器的一部分。語言規範允許發生像例如let \x = x + 2;這樣的表達式。我想詞法分析器對這種輸入做的是「迴歸」:在Prolog中讀取反斜槓時出現問題

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

,問題是,序言似乎忽視了\字符和「返回」上面寫的只是tokLambda行。

解決此問題的一種方法是以某種方式在程序代碼中每次出現之前或之後添加第二個反斜槓(因爲如果將原始輸入更改爲let \\x = x + 2;,但一切正常)但我不太喜歡。

任何想法?

編輯: 如果任何人都應該有類似的問題,這就是我如何解決它:

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

回答

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

+0

我從swi-prolog控制檯執行類似'? - lexer(X,「let \ x a」,[])。'的方法得到了字符串。我現在試圖讓它從文件中讀取。你能告訴我你的代碼應該做什麼,以便我可以嘗試使它在swi-prolog中工作? 編輯:謝謝你的鏈接!這似乎是我需要的。 – Jerry 2010-05-15 21:30:21

+0

我剛剛在回覆中記錄了代碼。 – 2010-05-15 21:54:12