summaryrefslogtreecommitdiffstats
path: root/parsing/codegen.sh
blob: c28ffcab8da374e3d81c9dc2157c8b0932f49f7d (plain)
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
toktext=''

toktext()
{
	local t="${1}"
	shift 1
	local n=

	case "${t%${US}*}" in
		# Operators
		T_EOF)       n='';;
		T_NEWLINE)   n="${LF}";;
		T_AND)       n='&';;
		T_SEMI)      n=';';;
		T_AND_IF)    n='&&';;
		T_OR_IF)     n='||';;
		T_DSEMI)     n=';;';;
		T_LESS)      n='<';;
		T_GREAT)     n='>';;
		T_DLESS)     n='<<';;
		T_DGREAT)    n='>>';;
		T_LESS)      n='<';;
		T_LESSAND)   n='<&';;
		T_GREAT)     n='>';;
		T_GREATAND)  n='>&';;
		T_LESSGREAT) n='<>';;
		T_DLESSDASH) n='<<-';;
		T_CLOBBER)   n='>|';;
		T_PIPE)      n='|';;
		T_LPAREN)    n='(';;
		T_RPAREN)    n=')';;
		# Reserved words
		T_IF)     n='if';;
		T_THEN)   n='then';;
		T_ELSE)   n='else';;
		T_ELIF)   n='elif';;
		T_FI)     n='fi';;
		T_DO)     n='do';;
		T_DONE)   n='done';;
		T_CASE)   n='case';;
		T_ESAC)   n='esac';;
		T_WHILE)  n='while';;
		T_UNTIL)  n='until';;
		T_FOR)    n='for';;
		T_LBRACE) n='{';;
		T_RBRACE) n='}';;
		T_BANG)   n='!';;
		T_IN)     n='in';;
		# Special symbols
		T_NAME)            n="${t#*${US}}";;
		T_FNAME)           n="${t#*${US}}";;
		T_CMDNAME)         n="${t#*${US}}";;
		T_IO_NUMBER)       n="${t#*${US}}";;
		T_WORD)            n="${t#*${US}}";;
		T_ASSIGNMENT_WORD) n="${t#*${US}}";;
		# Unknown
		*) n='';;
	esac

	toktext="${n}"
}

codegen()
{
	local toks="${1}"
	shift 1
	local subtoks=
	local t=

	case "${toks}" in
		*"${STX}"*"${ETX}"*)
			subtoks="${toks#*${STX}}"
			subtoks="${subtoks%${ETX}*}"
			toks="${toks%%${STX}*}$(codegen \
				"${subtoks}")${toks##*${ETX}}"
			;;
	esac

	IFS="${RS}"
	for t in ${toks}; do
		toktext "${t}"
		printf '%s ' "${toktext}"
	done
	unset IFS
}