2

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"))))

テキストファイルに出力するつもりはありません。次のキャラクターに移れるようにしたいだけです。私はそれを解決しようとして失敗しました。また、何らかの理由で、文字数値でエラーが発生し続けますか? と文字アルファベット?ファイルを 3 a + r として保存するときに期待する a の代わりに eof を指定したことを教えてくれます(たとえば)

それを文字列に変更する必要があることは知っていますが、実行できない「単語3 + 6」の文字列を取得し続けます(車)。'(word 3 + 4) を含む (define list file->list "blah.txt") ことができることをもう少し説明しますが、その後 (define str file->string "blah.txt" ) 「word 3 + 4」が含まれますが、(car str) で「word」を取り出すことはできません。全体 (car) は「word 3 + 4」なので、正しく説明できない場合はご容赦ください。スキームは初めてです

4

3 に答える 3

1

を使用してファイルの内容を読み取ります。これは、ファイル(file->lines "blah.txt")の各行をリスト内の文字列としてリストを返します。

その後、各行を操作するのは簡単です。たとえば、手順string->list(ドキュメントcdrを参照) を使用して行を文字のリストに変換し、リストを-ing して各文字を反復処理します。

于 2012-05-06T23:37:42.660 に答える
1

Racket (より一般的には Scheme) は、ファイルまたはストリームへのシーケンシャル アクセスを可能にするポートデータ型を提供します。そこから個々のバイトを 覗い読み取ることができます。

ラケットの参照ドキュメントがいくつかあります: Byte and String input

そのようなスキャナーの例として、Racket ベースの言語の作成に関する私のミニチュートリアルのセクション 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

于 2012-05-07T23:22:59.707 に答える
0

Scheme でスキャナーを実装する方法について少し読むことをお勧めします。Eric Hilsdale と Christopher T. Haynes は、非常に素晴らしいノートを書いています。

まずスキャナー: http://www.cs.indiana.edu/eip/compile/scanparse.html

次に、全体像: http://www.cs.indiana.edu/eip/compile/

于 2012-05-07T06:46:35.967 に答える