source: project/release/5/slib-prec/trunk/slib-standard-grammar.scm @ 38725

Last change on this file since 38725 was 38725, checked in by Kon Lovett, 4 months ago

scheme-ify grammar

File size: 5.7 KB
Line 
1;;;; slib-standard-grammar.scm  -*- Scheme -*-
2;;;; Kon Lovett, Apr '20
3
4;; JACAL: Symbolic Mathematics System.        -*-scheme-*-
5;; Copyright (C) 1989, 1990, 1991, 1992, 1993, 1995, 1997, 2007, 2009, 2010 Aubrey Jaffer.
6;;
7;; This program is free software; you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published by
9;; the Free Software Foundation, either version 3 of the License, or (at
10;; your option) any later version.
11;;
12;; This program is distributed in the hope that it will be useful, but
13;; WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15;; General Public License for more details.
16;;
17;; You should have received a copy of the GNU General Public License
18;; along with this program; if not, write to the Free Software
19;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
21;;;;The parse tables.
22;;; Definitions accumulate in top-level variable *SYN-DEFS*.
23
24(module slib-standard-grammar ()
25
26(import scheme)
27(import (chicken base))
28(import slib-prec-parse)
29(import slib-prec-grammar)
30
31;;;
32
33(include "slib-compat")
34(include "output-grammars")
35
36;;
37
38;;;Syntax definitions for STANDARD GRAMMAR
39
40(define (list2string dyn lst) (list->string lst))
41
42;;; Begin by Ignoring whitespace characters.
43(syntax-begin! (syntax-ignore-whitespace))
44
45;;; Character classes
46(prec:define-grammar (tok:char-group 49 #\* list2string))
47(prec:define-grammar (tok:char-group 50 #\/ list2string))
48(prec:define-grammar (tok:char-group 51 '(#\+ #\-) list2string))
49(prec:define-grammar (tok:char-group 20 '(#\|) list2string))
50(prec:define-grammar (tok:char-group 22 #\^ list2string))
51(prec:define-grammar (tok:char-group 21 '(#\&) list2string))
52(prec:define-grammar (tok:char-group 30 '(#\< #\> #\= #\: #\~) list2string))
53(prec:define-grammar (tok:char-group
54                      40
55                      (string-append "." tok:decimal-digits)
56                      (lambda (dyn l)
57                        (if (equal? '(#\.) l)
58                            #\.
59                            (string->number (list->string l))))))
60(prec:define-grammar (tok:char-group
61                      41
62                      (string-append tok:upper-case tok:lower-case "@%?_")
63                      list2string))
64(prec:define-grammar (tok:char-group
65                      (lambda (chr) (or (eqv? #\" chr) (eof-object? chr)))
66                      #\"
67                      (lambda (dyn l)
68                        (tok:read-char dyn)
69                        (list->string (cdr l)))))
70
71;;; Delimiters and Separators
72
73;;; Delimiters used to be defined here, but now are defined
74;;; dynamically by parse functions.
75(prec:define-grammar (prec:delim #\]))
76
77;;;prefix operators
78(prec:define-grammar (prec:prefix '+ #f 150))
79(prec:define-grammar (prec:prefix '- '- 150))
80
81(prec:define-grammar (prec:prefix '~ 'bitwise-not 120))
82
83(prec:define-grammar (prec:prefix #\! 'not 70))
84
85;(prec:define-grammar (prec:prefix ":" 'settemplate! 20))
86
87;;;nary operators
88(prec:define-grammar (prec:nary '* '* 120))
89(prec:define-grammar (prec:nary '/ '/ 120))
90(prec:define-grammar (prec:nary '+ '+ 100))
91(prec:define-grammar (prec:nary '- '- 100))
92
93(prec:define-grammar (prec:nary "&&" 'and 60))
94(prec:define-grammar (prec:nary "||" 'or 50))
95
96(prec:define-grammar (prec:nary "&" 'bitwise-and 110))
97(prec:define-grammar (prec:nary "|" 'bitwise-ior 100))
98(prec:define-grammar (prec:nary "^" 'bitwise-xor 100))
99
100;;;infix operators
101;(prec:infix 'x 'crossproduct 111 110)
102;(prec:define-grammar (prec:infix #\. 'ncmult 110 109))
103
104;(prec:define-grammar (prec:infix '(^ **) '^ 140 139))
105(prec:define-grammar (prec:infix '** 'expt 140 139))
106
107;(prec:define-grammar (prec:infix '^^ '^^ 210 210))
108
109;(prec:define-grammar (prec:infix '(":=" ":") 'define 180 20))
110(prec:define-grammar (prec:infix ":" 'define 180 20))
111
112(prec:define-grammar (prec:infix '= '= 80 80))
113;(prec:define-grammar (prec:infix '(~= <>) '<> 80 80))
114(prec:define-grammar (prec:infix '<> '<> 80 80))
115
116(prec:define-grammar (prec:infix 'mod 'mod 70 70))
117
118(prec:define-grammar (prec:infix ':: 'suchthat 190 40))
119
120;;;postfix operators
121;(prec:define-grammar (prec:postfix #\! 'factorial 160))
122;(prec:define-grammar (prec:postfix #\' 'differential 170))
123
124;;;matchfix operators
125(prec:define-grammar (prec:matchfix #\( identity #f #\))) ;MUST be procedure
126(prec:define-grammar (prec:matchfix #\[ 'vector #\, #\]))
127
128;(prec:define-grammar (prec:matchfix #\{ 'or #\, #\} (prec:infix "|" 'suchthat 190 40)))
129
130(prec:define-grammar (prec:matchfix #\\ 'lambda #\, #\;))
131
132;(prec:define-grammar (prec:matchfix "|" 'abs #f "|"))
133
134;;;special operators
135(prec:define-grammar (prec:inmatchfix #\( list #\, #\) 200)) ;MUST be procedure
136;(prec:define-grammar (prec:inmatchfix #\[ 'rapply #\, #\] 200))
137
138;;;rest operator reads expressions up to next delimiter.
139;(prec:define-grammar (prec:prestfix 'set 'set 10))
140;(prec:define-grammar (prec:prestfix 'show 'show 10))
141
142;;;miscellany
143;(prec:define-grammar (prec:prefix 'load 'load 50))
144;(prec:define-grammar (prec:nofix '% '%))
145;(prec:define-grammar (prec:nofix 'help 'help))
146;(prec:define-grammar (prec:nofix 'qed 'qed))
147
148(prec:define-grammar (prec:commentfix
149                      "/*"
150                      (lambda (str)
151                        (and str
152                             (not (eq? (get-grammar 'null) (active-echo-grammar)))
153                             (display str)))
154                      "*/"))
155
156(defgrammar 'standard
157  (make-grammar
158    'standard                             ;name
159    (make-delimited-parse-grammar-reader #\;) ;reader
160    (syntax-current)                        ;read-tab
161    print-using-grammar                               ;writer
162    tps:std))                                                 ;write-tab
163
164(syntax-end!)
165
166) ;slib-standard-grammar
Note: See TracBrowser for help on using the repository browser.