File: grammar

package info (click to toggle)
jacal 1c8-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 1,064 kB
  • sloc: lisp: 6,648; sh: 419; makefile: 315
file content (69 lines) | stat: -rwxr-xr-x 2,482 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

			      THE LEXER

In English.scm there are the lines:
(lex:def-class 70 '(#\^) #f)
(lex:def-class 49 '(#\*) #f)
(lex:def-class 50 '(#\/) #f)
(lex:def-class 51 '(#\+ #\-) #f)
(lex:def-class 20 '(#\|) #f)
(lex:def-class 30 '(#\< #\> #\= #\: #\~) #f)
(lex:def-class 40 '(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9)
	       (lambda (l) (string->number (list->string l))))
(lex:def-class 41
	    '(#\A #\B #\C #\D #\E #\F #\G #\H #\I #\J #\K #\L #\M
	      #\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W #\X #\Y #\Z
	      #\a #\b #\c #\d #\e #\f #\g #\h #\i #\j #\k #\l #\m
	      #\n #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x #\y #\z
	      #\@ #\_ #\% #\?)
	    #f)
(lex:def-class (lambda (chr) (or (eqv? #\" chr) (eof-object? chr)))
	    '(#\")
	    (lambda (l)
	      (lex:read-char) (string->symbol (list->string (cdr l)))))
(lex:def-class 0 (list slib:tab slib:form-feed #\  #\newline) #f)

These lines define which character can be grouped into symbols in the
standard input-grammar.  In the first line is only the character ^ and
its class number is not 1 removed from any other.  Therefore it can
only group with itself.  Eg.  ^ ^^ ^^^ ^^^^ ...

e5 : a+^^^^-c;

e5: ^^^^ + a - c

The line (lex:def-class 30 '(#\< #\> #\= #\: #\~) #f) says that any
consecutive combination of < > = : and ~ will be grouped together.

41 is one greater than 40 so a symbol can begin with a class 41
character and continue with either class 41 or class 40 characters.

51 can have subsequent 50 characters; this gives us +/- and -/+.
50 can have subsequent 49 characters; this gives us /*.

Class 0 is special (all the other numbers are arbitrary).  It
designates whitespace.

#\" has a function rather than a class number.  This function is #t
when the symbol should end.

The last argument to lex:def-class is the function to run on the list
of characters of a symbol.  If #f then a symbol is generated from the
character list.

			 INSTALLING A GRAMMAR

(defgrammar 'mygrammar
  (make-grammar 'mygrammar
		(lambda (grm) (read))		;the reader
		#f				;lex-tab
		#f				;read-tab
		(lambda (sexp grm) (write sexp));the writer
		#f))				;write-tab

The grm arguments are passed the whole grammar (a list of the args
passed to make-grammar).  Lex-tab is used by the lexer if you call it.
The read-tab can be used by the reader if you want it.  the write-tab
contains the templates for the writer.  You can probably use inprint
for the writer (which uses templates like those at the beginning of
English.scm).