我有一个txt文件“blah.txt”,内容为
word 3 + 6
现在考虑以下代码:
(define c (read-char file))
(define (toke c)
(cond
((null? c)(write "empty"))
((equal? (read-char c) #\space)(write 'space)
; (toke (with the next character)
)
((equal? (read-char c) #\+) (write '+)
; (toke (with the next character)
)
((equal? (read-char c) #\-) (write '-)
; (toke (with the next character)
)
((equal? (read-char c) #\*) (write '*)
; (toke (with the next character)
)
((equal? (read-char c) #\/) (write '/)
; (toke (with the next character)
)
((equal? (read-char c) #\=) (write '=)
; (toke (with the next character)
)
((equal? (read-char c) #\() (write 'LPAREN)
; (toke (with the next character)
)
((equal? (read-char c) #\)) (write 'RPAREN)
; (toke (with the next character)
)
((char-numeric? (read-char c)) (write 'Num)
; (toke (with the next character)
)
((char-alphabetic? (read-char c))(write 'ID)
; (toke (with the next character)
)
(else
(write "error"))))
我不打算输出到文本文件。我只是希望能够继续下一个角色。 我尝试解决它的尝试都没有成功。 也出于某种原因,我一直在使用字符数字错误?和字母字母?告诉我,当我保存文件时,我已经给了它eof而不是它所期望的 3 a + r(例如)
我知道它涉及将其更改为字符串,但我不断收到一串“字3 + 6”,我无法做到(汽车)。 让我再解释一下 我知道你能做到 (定义清单 file-> list“blah.txt”) 其中将包含'(字3 + 4) 但后来呢 (定义str file-> string“blah.txt”) 它将包含“word 3 + 4” 并且我不能(汽车str)得到“字”,因为整个(汽车)是“字3 + 4” 如果我不能正确解释自己,请原谅我,因为我不熟悉计划
答案 0 :(得分:1)
使用(file->lines "blah.txt")
读取文件的内容,这将返回一个列表,文件的每一行都作为列表中的字符串。
在那之后,操纵每一行都很简单;例如,使用过程string->list
(请参阅documentation)将一行转换为字符列表,并通过列表cdr
遍历每个字符。
答案 1 :(得分:1)
Racket(更一般地说,Scheme)提供了一个 port 数据类型,允许您获得对文件或流的顺序访问。您可以查看并从中读取个别字节。
这里有一些参考Racket文档:Byte and String input。
作为此类扫描仪的一个示例,您可以查看我的迷你教程的Section 6,了解制作基于球拍的语言。
请注意,字符串本身不是端口,但我们可以创建一个源来自字符串的端口。 Racket提供open-input-string
函数将字符串转换为输入端口。所以你应该能够做到这样的事情:
#lang racket
(define myport (open-input-string "hello"))
(printf "I see: ~s\n" (read-char myport))
(printf "I see: ~s\n" (read-char myport))
(printf "I see: ~s\n" (read-char myport))
(printf "I see: ~s\n" (read-char myport))
(printf "I see: ~s\n" (read-char myport))
看到个别角色出来。将read-char
更改为peek-char
,您会看到peek-char
不会将数据从端口中删除,但允许您查看进入该端口。
答案 2 :(得分:0)
我建议您阅读一些关于如何在Scheme中实现扫描仪的内容。 Eric Hilsdale和Christopher T. Haynes写了一些非常好的笔记。
首先是扫描仪: http://www.cs.indiana.edu/eip/compile/scanparse.html