~mildred/+junk/jam-shell

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/bin/sh

# yyacc - yacc wrapper
#
# Allows tokens to be written as `literal` and then automatically 
# substituted with #defined tokens.
#
# Usage:
#	yyacc file.y filetab.h file.yy 
#
# inputs:
#	file.yy		yacc grammar with ` literals
#
# outputs:
#	file.y		yacc grammar
#	filetab.h	array of string <-> token mappings
#
# 03-13-93 - Documented and p moved in sed command (for some reason, 
#	s/x/y/p doesn't work).
# 10-12-93 - Take basename as second argument.
# 12-31-96 - reversed order of args to be compatible with GenFile rule
# 03/19/02 (seiwald) - suffix symbols with _t to avoid conflicts
#

outy=${1?}
outh=${2?}
in=${3?}
out=`basename $in .yy`

T=/tmp/yy$$
trap 'rm -f $T.*' 0

sed '
	: 1
	/`/{
		h
		s/[^`]*`\([^`]*\)`.*/\1/
		p
		g
		s/[^`]*`[^`]*`//
		b 1
	}
	d
' $in | sort -u | sed '
	h
	y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
	s/:/_COLON/
	s/!/_BANG/
	s/&&/_AMPERAMPER/
	s/&/_AMPER/
	s/+/_PLUS/
	s/||/_BARBAR/
	s/|/_BAR/
	s/;/_SEMIC/
	s/-/_MINUS/
	s/</_LANGLE/
	s/>/_RANGLE/
	s/\./_PERIOD/
	s/?/_QUESTION/
	s/=/_EQUALS/
	s/,/_COMMA/
	s/\[/_LBRACKET/
	s/]/_RBRACKET/
	s/{/_LBRACE/
	s/}/_RBRACE/
	s/(/_LPAREN/
	s/)/_RPAREN/
	s/.*/&_t/
	G
	s/\n/ /
' > $T.1

sed '
	s:^\(.*\) \(.*\)$:s/`\2`/\1/g:
	s:\.:\\.:g
	s:\[:\\[:g
' $T.1 > $T.s

rm -f $outy $outh

(
	sed 's:^\(.*\) \(.*\)$:%token \1:' $T.1
	sed -f $T.s $in
) > $outy

(
	sed 's:^\(.*\) \(.*\)$:	{ "\2", \1 },:' $T.1 
) > $outh