;;;; ;;;; genturfahi - lo la .ckim. ke pe'a jajgau ratcu ke'e genturfa'i ;;;; `-> A Scheme packrat parser. ;;;; ;;;; Copyright (c) 2010 ".alyn.post." ;;;; ;;;; Permission to use, copy, modify, and/or distribute this software for any ;;;; purpose with or without fee is hereby granted, provided that the above ;;;; copyright notice and this permission notice appear in all copies. ;;;; ;;;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ;;;; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ;;;; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ;;;; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ;;;; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ;;;; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ;;;; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ;;;; ;;; ;;; parser options. The default values are commented out. ;;; ;; The name of the symbol the parser generator ;; rules will be bound to in the output file. ;; ;{(define-name "gerna")} {(define-name "genturfahi-peg-gerna")} ;; Enable debugging of the paser. ;; ;; Describe the parse as it occurs, describing which rules matched ;; and which rules didn't. ;; ;{(debug-file "grammar-debug.scm")} ;{(debug #f)} ;; Enable profiling of the parser. ;; ;; Record the time expended by each rule determining whether it ;; matches. ;; ;{(profile-file "grammar-profile.scm")} ;{(profile #f)} ;; Enable memoization of non-terminals. ;; ;; ;{(no-memoize #f)} ;; The sentinel character cannot be a valid character in the ;; grammar. ;; ;{(sentinel #\nul)} ;; The value returned when we match the empty list. ;; ;{(empty-list '())} ;; The value returned when we match the empty string. ;; ;{(empty-string "")} ;; The value returned when the input does not match the grammar. ;; ;{(nonmatch-token #f)} ;; PEG grammar ;; cfari <- canlu `cfari-samselpla* canlu #:gerna gerna `FAhO -> samselpla-cfari ; we want to execute header code before compiling the grammar. ; this rule is here to associated a different code action with ; header code than body code. ; cfari-samselpla <- #\{ canlu #:rodalerfu (!#\} .)+ #\} canlu -| samselpla-cfari-samselpla gerna <- smuni* smuni <- #:naselci naselci "<-" canlu #:javni javni -> samselpla-smuni naselci <- #:cfari [[:alnum:]$%:=>^~_@] #:fanmo [[:alnum:]$%:=>^~_@.!&/\-]* canlu -> samselpla-naselci javni <- jonai / je jonai <- #:cfari je #:fanmo (#\/ canlu je)+ -> samselpla-jonai je <- #:javni nastura-pajavni+ #:samselpla samselpla? -> samselpla-je nastura-pajavni <- #\` canlu #:javni pajavni -> samselpla-nastura-javni / pajavni pajavni <- dot-zero-or-more / dot-one-or-more / dot-kuspe / optional / zero-or-more / one-or-more / kuspe / and-predicate / end-of-input / not-predicate / #:cmene cmene-sumti? #:javni selci-javni -> samselpla-pajavni-cmene dot-zero-or-more <- #:cmene cmene-sumti? #\. canlu #\* canlu -> {samselpla-.*} dot-one-or-more <- #:cmene cmene-sumti? #\. canlu #\+ canlu -> {samselpla-.+} dot-kuspe <- #:cmene cmene-sumti? #\. canlu #\{ canlu #:my namcu? ( #:slakabu ,#\, canlu )? #:ny namcu? #\} canlu -> {samselpla-.kuspe} optional <- #:cmene cmene-sumti? #:javni selci-javni #\? canlu -> {samselpla-?} zero-or-more <- #:cmene cmene-sumti? #:javni selci-javni #\* canlu -> {samselpla-*} one-or-more <- #:cmene cmene-sumti? #:javni selci-javni #\+ canlu -> {samselpla-+} kuspe <- #:cmene cmene-sumti? #:javni selci-javni #\{ canlu #:my namcu? ( #:slakabu ,#\, canlu )? #:ny namcu? #\} canlu -> samselpla-kuspe and-predicate <- #\& canlu #:javni selci-javni -> {samselpla-&} end-of-input <- #\! canlu #\. canlu -> samselpla-fanmo not-predicate <- #\! canlu #:javni selci-javni -> {samselpla-!} cmene-sumti <- "#:" #:cfari [[:alnum:]$%:=>^~_@] #:fanmo [[:alnum:]$%:=>^~_@.!&/\-]* canlu -> samselpla-cmene-sumti selci-javni <- selci-naselci / lerfu-selci / valsi-selci / klesi-selci / denpabu / girzu-javni selci-naselci <- #:naselci naselci !"<-" -> samselpla-selci-naselci lerfu-selci <- ",#\\" #:lerfu lerfu-cmene canlu -> samselpla-stura-lerfu-selci / ",#\\" #:lerfu . canlu -> samselpla-stura-lerfu-selci / "#\\" #:lerfu lerfu-cmene canlu -> samselpla-lerfu-selci / "#\\" #:lerfu . canlu -> samselpla-lerfu-selci lerfu-cmene <- "space" -> samselpla-lerfu-space / "return" -> samselpla-lerfu-return / "linefeed" -> samselpla-lerfu-linefeed / "newline" -> samselpla-lerfu-newline / "tab" -> samselpla-lerfu-tab / "page" -> samselpla-lerfu-page valsi-selci <- ",\"\"" canlu -> samselpla-stura-empty-string / "\"\"" canlu -> samselpla-empty-string / ",\"" #:valsi-lerfu (!#\" valsi-lerfu)+ #\" canlu -> samselpla-stura-valsi-selci / #\" #:valsi-lerfu (!#\" valsi-lerfu)+ #\" canlu -> samselpla-valsi-selci valsi-lerfu <- #\\ #\n -> samselpla-valsi-newline / #\\ #\r -> samselpla-valsi-return / #\\ #\t -> samselpla-valsi-tab / #\\ #\f -> samselpla-valsi-page / #\\ #\\ -> samselpla-valsi-backslash / #\\ #\' -> samselpla-valsi-single-quote / #\\ #\" -> samselpla-valsi-double-quote / !#\\ #:lerfu . -> samselpla-valsi-lerfu klesi-selci <- #\[ #:klesi-lerfu klesi-lerfu+ "]*" canlu -> {samselpla-klesi-selci-*} / #\[ #:klesi-lerfu klesi-lerfu+ "]+" canlu -> {samselpla-klesi-selci-+} / #\[ #:klesi-lerfu klesi-lerfu+ "]" canlu #\{ canlu #:my namcu? ( #:slakabu ,#\, canlu )? #:ny namcu? #\} canlu -> {samselpla-klesi-selci-kuspe} / #\[ #:klesi-lerfu klesi-lerfu+ #\] canlu -> samselpla-klesi-selci klesi-lerfu <- klesi-cmene / klesi-binxo / !#\] #:klesi-lerfu . -> samselpla-klesi-lerfu klesi-cmene <- "[:alnum:]" -> samselpla-alnum / "[:alpha:]" -> samselpla-alpha / "[:ascii:]" -> samselpla-ascii / "[:blank:]" -> samselpla-blank / "[:cntrl:]" -> samselpla-cntrl / "[:digit:]" -> samselpla-digit / "[:graph:]" -> samselpla-graph / "[:jbole'u:]" -> samselpla-jbolehu / "[:jboca'u:]" -> samselpla-jbocahu / "[:lower:]" -> samselpla-lower / "[:odigit:]" -> samselpla-odigit / "[:print:]" -> samselpla-print / "[:punct:]" -> samselpla-punct / "[:space:]" -> samselpla-space / "[:upper:]" -> samselpla-upper / "[:xdigit:]" -> samselpla-xdigit / "[:^alnum:]" -> samselpla-^alnum / "[:^alpha:]" -> samselpla-^alpha / "[:^ascii:]" -> samselpla-^ascii / "[:^blank:]" -> samselpla-^blank / "[:^cntrl:]" -> samselpla-^cntrl / "[:^digit:]" -> samselpla-^digit / "[:^graph:]" -> samselpla-^graph / "[:^lower:]" -> samselpla-^lower / "[:^odigit:]" -> samselpla-^odigit / "[:^print:]" -> samselpla-^print / "[:^punct:]" -> samselpla-^punct / "[:^space:]" -> samselpla-^space / "[:^upper:]" -> samselpla-^upper / "[:^xdigit:]" -> samselpla-^xdigit klesi-binxo <- #\\ #\n -> samselpla-klesi-newline / #\\ #\r -> samselpla-klesi-return / #\\ #\t -> samselpla-klesi-tab / #\\ #\f -> samselpla-klesi-page / #\\ #\[ -> samselpla-klesi-lbracket / #\\ #\] -> samselpla-klesi-rbracket / #\\ #\\ -> samselpla-klesi-backslash denpabu <- #\. canlu -> samselpla-denpabu samselpla <- "->" canlu ( samselpla-xadni / samselpla-cmene ) -> samselpla-samselpla-balvi / "-|" canlu ( samselpla-xadni / samselpla-cmene ) -> samselpla-samselpla-cabna samselpla-xadni <- #\{ canlu #:rodalerfu (!#\} .)+ #\} canlu -> samselpla-samselpla-xadni samselpla-cmene <- #:cfari [[:alnum:]$%:=>^~_@] #:fanmo [[:alnum:]$%:=>^~_@.!&/\-]* canlu -> samselpla-samselpla-cmene girzu-javni <- "()" canlu -> samselpla-empty-list / #\( canlu javni #\) canlu -> samselpla-girzu-javni namcu <- [[:digit:]]+ canlu canlu <- `(canlubu / totoi)* canlubu <- [[:space:]] / CRLF totoi <- #\; (!CRLF .)* (CRLF / &FAhO) CR <- #\return LF <- #\linefeed CRLF <- CR LF / CR / LF FAhO <- !.