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

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

remove unused, tighten prefix

File size: 5.8 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 70 #\^ list2string))
47(prec:define-grammar (tok:char-group 49 #\* list2string))
48(prec:define-grammar (tok:char-group 50 #\/ list2string))
49(prec:define-grammar (tok:char-group 51 '(#\+ #\-) list2string))
50(prec:define-grammar (tok:char-group 20 '(#\|) list2string))
51(prec:define-grammar (tok:char-group 30 '(#\< #\> #\= #\: #\~) list2string))
52(prec:define-grammar (tok:char-group
53                      40
54                      (string-append "." tok:decimal-digits)
55                      (lambda (dyn l)
56                        (if (equal? '(#\.) l)
57                            #\.
58                            (string->number (list->string l))))))
59(prec:define-grammar (tok:char-group
60                      41
61                      (string-append tok:upper-case tok:lower-case "@%?_")
62                      list2string))
63(prec:define-grammar (tok:char-group
64                      (lambda (chr) (or (eqv? #\" chr) (eof-object? chr)))
65                      #\"
66                      (lambda (dyn l)
67                        (tok:read-char dyn)
68                        (list->string (cdr l)))))
69
70;;; Delimiters and Separators
71
72;;; Delimiters used to be defined here, but now are defined
73;;; dynamically by parse functions.
74(prec:define-grammar (prec:delim #\])
75                     ;;(prec:delim #\;)
76                     ;;(prec:delim #\,)
77                     ;;(prec:postfix #\$ (lambda (x) (write x)) 0)
78                     )
79
80;;;prefix operators
81(prec:define-grammar (prec:prefix '+ #f 150))
82(prec:define-grammar (prec:prefix '- 'negate 150))
83(prec:define-grammar (prec:prefix "+/-" 'u+/- 150))
84(prec:define-grammar (prec:prefix "-/+" 'u-/+ 150))
85
86(prec:define-grammar (prec:prefix '(not ~) 'impl:not 70))
87
88(prec:define-grammar (prec:prefix ":" 'settemplate! 20))
89
90;;;nary operators
91(prec:define-grammar (prec:nary '* '* 120))
92(prec:define-grammar (prec:nary '/ '/ 120))
93(prec:define-grammar (prec:nary '+ '+ 100))
94(prec:define-grammar (prec:nary '- '- 100))
95(prec:define-grammar (prec:nary "+/-" 'b+/- 100))
96(prec:define-grammar (prec:nary "-/+" 'b-/+ 100))
97
98(prec:define-grammar (prec:nary '(and #\&) '& 60))
99(prec:define-grammar (prec:nary 'or 'or 50))
100(prec:define-grammar (prec:nary "||" 'parallel 110))
101
102;;;infix operators
103;(prec:infix 'x 'crossproduct 111 110)
104(prec:define-grammar (prec:infix #\. 'ncmult 110 109))
105(prec:define-grammar (prec:infix '(^ **) '^ 140 139))
106
107(prec:define-grammar (prec:infix '^^ '^^ 210 210))
108
109(prec:define-grammar (prec:infix '(":=" ":") 'define 180 20))
110
111(prec:define-grammar (prec:infix '= '= 80 80))
112;(prec:define-grammar (prec:infix '(~= <>) 'make-not-equal 80 80))
113
114(prec:define-grammar (prec:infix 'mod 'mod 70 70))
115
116(prec:define-grammar (prec:infix ':: 'suchthat 190 40))
117(prec:define-grammar (prec:infix "|" 'suchthat 190 40))
118
119;;; I don't remember what I had in mind here.
120;(prec:define-grammar (prec:infix "" '* 120 120)) ;null operator
121
122;;;postfix operators
123(prec:define-grammar (prec:postfix #\! 'factorial 160))
124(prec:define-grammar (prec:postfix #\' 'differential 170))
125
126;;;matchfix operators
127(prec:define-grammar (prec:matchfix #\( identity #f #\)))
128(prec:define-grammar (prec:matchfix #\[ vector #\, #\]))
129(prec:define-grammar (prec:matchfix #\{ 'or #\, #\}
130                                   (prec:infix "|" 'suchthat 190 40)))
131(prec:define-grammar (prec:matchfix #\\ 'lambda #\, #\;))
132(prec:define-grammar (prec:matchfix "|" 'abs #f "|"))
133
134;;;special operators
135(prec:define-grammar (prec:inmatchfix #\( list #\, #\) 200))
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.