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
|