4

標準入力の代わりに文字列から文字を読み取るパーサーとレクサーを (巧妙に) 生成しようとしています。

http://code.google.com/p/lalr-scm/source/browse/trunk/calc.scm?r=52のコードに含まれる電卓の例の修正を開始しました。

問題は次の行にあるようです。

(let* ((location (make-source-location "*stdin*" 
(port-line (current-input-port)) 
(port-column (current-input-port)) -1 -1))

新しい入力ポートを定義しようとしました:

(let* ((location (make-source-location "*stdin*" 
(port-line (open-input-string program)) 
(port-column (open-input-string program)) -1 -1))

変数プログラムは次のように定義されました。

(define program
"int x = 2;
 int y = 0;
 y= x*(2+3);"
 )     

それでも機能しません。標準入力文字を待ちます。

ドキュメントには詳細が欠けているため、これをどのように解決できるかわかりません。

ありがとうございました

4

1 に答える 1

2

あなたは解決策に非常に近いです!そうですね。しかし、ここからが始まりです。元のコードの、変更していた場所を見てください。

(let* ((location (make-source-location "*stdin*" (port-line (current-input-port)) (port-column (current-input-port)) -1 -1))
       (c (read-char)))
  ...)

ここでは、すべてを文字列ポートに変更しました (ところで、毎回独立したカーソルを使用して新しい文字列ポートを作成するため、複数回(current-input-port)呼び出さないでください) が、実際に を使用する場所はそれだけではありません。open-input-string(current-input-port)

あなた見えますか?それは実際に(read-char)通話中です!その関数は実際にはポート引数を取り、デフォルトは(current-input-port)です。

実際、上記を見て and のインスタンスを検索する(read-char)(peek-char)、 の使用が関数(current-input-port)全体にかなり組み込まれていることがわかりmake-lexerます。したがって、それを変更する必要があります。

make-lexer関数への入力ポートを指定することをお勧めします。

(define* (make-lexer errorp #:optional (input (current-input-port)))
  ...

次に、 andのすべてのインスタンスを入力ポートを使用するように変更します。また、呼び出しも変更することを忘れないでください。(read-char)(peek-char)make-source-location

(let* ((location (make-source-location "*stdin*" (port-line input) (port-column input) -1 -1))
       (c (read-char input)))
  ...)

これで、使用でき(make-lexer errorp (open-input-string program))、動作するはずです。(私はそれをテストしていません。)

于 2012-11-15T13:29:37.350 に答える