summaryrefslogtreecommitdiff
path: root/test/trans.d/ragel-c.lm
blob: ccc2dc939ef665384a2967db34697af622a16d1e (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
namespace c_inline
	lex 
		literal `fpc `fc  `fcurs `ftargs
			`fentry `fhold `fexec `fgoto `fnext
			`fcall `fret `fbreak `fncall `fnret `fnbreak

		token ident /ident/
		token number /digit+/
		token hex_number /'0x' [0-9a-fA-F]+/

		token comment
			/ c_comment | cpp_comment /

		token string
			/ s_literal | d_literal /

		token whitespace
			/ ( [ \t] | NL )+ /

		literal 
			`{ `} `:: `* `, `( `) `;

		token var_ref
			/ "$" [a-zA-Z_][a-zA-Z_0-9]* /
			{
				if GblActionParams 
				{
					input->push( make_token(
							typeid<var_ref>, input->pull( match_length ) ) )
				}
				else
				{
					# Just pull one char. Don't consume the word because it may
					# be a keyword.
					input->push( make_token(
							typeid<c_any>, input->pull( 1 ) ) )
				}
			}

		token c_any
			/ any /
	end

	def inline_expr
		[expr_item_list] :List

	def expr_item_list
		[expr_item_list expr_item] :Rec
	|	[] :Empty

	def expr_item
		[expr_any] :ExprAny
	|	[expr_symbol] :ExprSymbol
	|	[expr_interpret] :ExprInterpret

	def expr_any
		[whitespace] :WS
	|	[comment] :Comment
	|	[string] :String
	|	[number] :Number
	|	[hex_number] :Hex
	|	[ident] :Ident
	|	[c_any] :Any

	def expr_symbol
		[`,] :Comma | [`(] :Open | [`)] :Close | [`*] :Star | [`::] :DoubleColon

	def expr_interpret
		[`fpc] :Fpc
	|	[`fc] :Fc
	|	[`fcurs] :Fcurs
	|	[`ftargs]  :Ftargs
	|	[`fentry `( state_ref srlex::`)] :Fentry
	|	[var_ref] :VarRef

	def state_ref
		[opt_name_sep state_ref_names] :Ref

	def opt_name_sep
		[srlex::`::] :ColonColon
	|	[] :Empty

	# List of names separated by ::
	def state_ref_names
		[state_ref_names srlex::`:: srlex::word] :Rec
	|	[srlex::word] :Base

	def inline_block
		[block_item_list] :List
	
	def block_item_list
		[block_item block_item_list] :Rec
	|	[] :Base
	
	def block_item
		[expr_any] :ExprAny
	|	[block_symbol] :BlockSymbol
	|	[block_interpret] :BlockInterpret
	|	[`{ inline_block `}] :RecBlock

	def block_symbol
		[`,] :B1 | [`;] :B2 | [`(] :B3 | [`)] :B4 | [`*] :B5 | [`::] :B6

	def block_interpret
		[expr_interpret] :ExprInterpret
	|	[`fhold whitespace? `;] :Fhold
	|	[`fgoto whitespace? `* inline_expr `;] :FgotoExpr
	|	[`fnext whitespace? `* inline_expr `;] :FnextExpr
	|	[`fcall whitespace? `* inline_expr `;] :FcallExpr
	|	[`fncall whitespace? `* inline_expr `;] :FncallExpr
	|	[`fexec inline_expr `;] :Fexec
	|	[`fgoto state_ref srlex::`;] :FgotoSr
	|	[`fnext state_ref srlex::`;] :FnextSr
	|	[`fcall state_ref srlex::`;] :FcallSr
	|	[`fncall state_ref srlex::`;] :FncallSr
	|	[`fret `;] :Fret
	|	[`fnret `;] :Fnret
	|	[`fbreak `;] :Fbreak
	|	[`fnbreak `;] :Fnbreak
end


namespace c_host
	lex 
		literal `%%{

		token slr / '%%' [^{] [^\n]* '\n' /
		{
			# Translates single line to multi-line
			input->pull( 2 )
			R: str = input->pull( match_length - 3 )
			input->push( "\n}%%" )
			input->push( R )
			input->push( "%%{" )
		}

		rl NL / '\n' /

		rl s_literal
			/ "'" ([^'\\\n] | '\\' (any | NL))* "'" /

		rl d_literal
			/ '"' ([^"\\] | NL | '\\' (any | NL))* '"' /

		token ident /ident "'"?/
		token number /digit+/
		token hex_number /'0x' [0-9a-fA-F]+/

		token comment
			/ c_comment | cpp_comment /

		token string
			/ s_literal | d_literal /

		token whitespace
			/ ( [ \t] | NL )+ /

		token c_any / any /
	end

	def tok
		[ident] :Ident
	|	[number] :Number
	|	[hex_number] :HexNumber
	|	[comment] :Comment
	|	[string] :String
	|	[whitespace] :Whitespace
	|	[c_any] :Any

	def section
		[`%%{ ragel::ragel_start ragel::`}%%] :MultiLine
	|	[tok] :Tok
end