patch for lalr-2.0 to support guile
Thien-Thi Nguyen <[email protected]>
| Newsgroups | gmane.lisp.guile.user,gmane.lisp.guile.sources |
|---|---|
| Message-ID | <E17wHSL-00073q-00@giblet> |
hello, thanks for writing lalr. it is exactly what i'm looking for (bison replacement in scheme). i added some bits to make it work w/ guile and have appended the patch for your consideration in the next release of lalr. here is a changelog entry: 2002-09-30 Thien-Thi Nugyen <[email protected]> * Makefile (any): Add support for guile. (guile, check-guile): New targets. (clean): New target. * ports/guile.decls: New file. * tests: New subdir. * tests/guile.test: New file. * README: Mention tests/ subdir. * lalr.skl: Fix spelling error. i am currently working on a simple grammar to parse C header (.h) files for possible contribution to examples/ (and use by guile), but figured these other changes should not be held back by that work in progress. let me know if you would prefer "diff -c" or some other format... thi ________________________________________ cd ~/tmp/ diff -wburN lalr-2.0 lalr-2.0ttn1 diff -wburN lalr-2.0/Makefile lalr-2.0ttn1/Makefile --- lalr-2.0/Makefile Thu Jun 20 06:25:57 2002 +++ lalr-2.0ttn1/Makefile Mon Sep 30 23:58:19 2002 @@ -19,6 +19,7 @@ @echo " make plt-scheme" @echo " make sisc" @echo " make chicken" + @echo " make guile" @echo "********************" #; ---------------------------------------------------------------------- ;# @@ -54,6 +55,24 @@ @echo "done." #; ---------------------------------------------------------------------- ;# +#; Guile build ;# +#; ---------------------------------------------------------------------- ;# +guile: + @echo "building lalr.scm for guile..." + @./lalr.skl guile + @echo "done." +check-guile: + @echo "checking lalr.scm for guile..." + @guile -s tests/guile.test `pwd`/lalr.scm + @echo "done." + +#; ---------------------------------------------------------------------- ;# +#; clean ;# +#; ---------------------------------------------------------------------- ;# +clean: + rm -f lalr.scm + +#; ---------------------------------------------------------------------- ;# #; documentation ;# #; ---------------------------------------------------------------------- ;# doc: @@ -71,3 +90,4 @@ backup: @tar zcf ../lalr-sources.taz * \ No newline at end of file + diff -wburN lalr-2.0/README lalr-2.0ttn1/README --- lalr-2.0/README Thu Jun 20 06:25:01 2002 +++ lalr-2.0ttn1/README Tue Oct 1 00:03:44 2002 @@ -8,7 +8,8 @@ . Makefile : makefile for generating system-specific parser generators. . examples/ : examples of parsers (directory is currently empty) - . ports/ : + . ports/ : scheme-implementation-dependent bits + . tests/ : test scripts It has been successfully tested under the following Scheme systems: diff -wburN lalr-2.0/documentation/lalr.html lalr-2.0ttn1/documentation/lalr.html --- lalr-2.0/documentation/lalr.html Thu Jun 20 06:59:40 2002 +++ lalr-2.0ttn1/documentation/lalr.html Mon Sep 30 22:57:32 2002 @@ -146,7 +146,7 @@ return the symbol <code>'*eoi*</code> each time it is invoked. <br><p> -The error procedure must be a function that accepts at least to +The error procedure must be a function that accepts at least two parameters. <p><table border="0" width="100%"><tr><td class="md"><b><font size=+3><a name="format">The grammar format</a></font></b></td></tr></table><br> diff -wburN lalr-2.0/lalr.skl lalr-2.0ttn1/lalr.skl --- lalr-2.0/lalr.skl Thu Jun 20 06:58:42 2002 +++ lalr-2.0ttn1/lalr.skl Tue Oct 1 00:20:01 2002 @@ -9,6 +9,7 @@ plt-scheme) DECLS=ports/plt-scheme.decls;; sisc) DECLS=ports/sisc.decls;; chicken) DECLS=ports/chicken.decls;; + guile) DECLS=ports/guile.decls;; *) echo "invalid Scheme system: $1" ; exit 1;; esac @@ -127,7 +128,7 @@ ;! Once the end of file is encountered, the lexical analyzer must always !; ;! return the symbol @c ('*eoi*) each time it is invoked. !; ;! !; -;! The error procedure must be a function that accepts at least to !; +;! The error procedure must be a function that accepts at least two !; ;! parameters. !; ;; ---------------------------------------------------------------------- ;; ;! @section (format "The grammar format") !; diff -wburN lalr-2.0/ports/guile.decls lalr-2.0ttn1/ports/guile.decls --- lalr-2.0/ports/guile.decls Wed Dec 31 16:00:00 1969 +++ lalr-2.0ttn1/ports/guile.decls Mon Sep 30 22:16:53 2002 @@ -0,0 +1,7 @@ +;; contributed by Thien-Thi Nguyen <[email protected]> + +(begin + (defmacro def-macro (form . body) + `(defmacro ,(car form) ,(cdr form) ,@body)) + (def-macro (BITS-PER-WORD) 28) + (def-macro (logical-or x . y) `(logior ,x ,@y))) diff -wburN lalr-2.0/tests/guile.test lalr-2.0ttn1/tests/guile.test --- lalr-2.0/tests/guile.test Wed Dec 31 16:00:00 1969 +++ lalr-2.0ttn1/tests/guile.test Tue Oct 1 00:00:25 2002 @@ -0,0 +1,49 @@ +;; usage: guile -s guile.test /ABSOLUTE/PATH/TO/lalr.scm + +(format #t "(getcwd) => ~A\n" (getcwd)) + +(or (and (< 1 (length (command-line))) + (file-exists? (cadr (command-line))) + (load (cadr (command-line)))) + (error "usage: guile -s guile.test /ABSOLUTE/PATH/TO/lalr.scm")) + +;; from documentation example +(define expr-parser + (lalr-parser + ;; Terminal symbols + (ID + - * /) + ;; Productions + (e (e + t) : (+ $1 $3) + (e - t) : (- $1 $3) + (t) : $1) + (t (t * f) : (* $1 $3) + (t / f) : (/ $1 $3) + (f) : $1) + (f (ID) : $1))) + +(format #t "expr-parser => ~A\n" expr-parser) + +(define token-stream + '((ID . 3) (+) (ID . 3) (*) (ID . 13))) + +(define (lexer) + (let ((ret (car token-stream))) + (set! token-stream (cdr token-stream)) + (if (null? token-stream) + (set! token-stream (list '*eoi*))) + ret)) + +(define (error-handler . args) + (format #t "error-handler: args => ~A\n" args) + (exit 1)) + +(define expected 42) +(define actual #f) + +(format #t "~A => ~A\n" + '(expr-parser lexer error-handler) + (begin + (set! actual (expr-parser lexer error-handler)) + actual)) + +(exit (and (number? actual) (= expected actual))) Compilation exited abnormally with code 1 at Tue Oct 1 00:20:16 _______________________________________________ Guile-user mailing list [email protected] http://mail.gnu.org/mailman/listinfo/guile-user