@@ -14,172 +14,224 @@ use crate::program::{
1414 SourceLocation , SpecialVar , VarId ,
1515} ;
1616use crate :: regex:: Regex ;
17+
1718use pest:: error:: InputLocation ;
18- use pest:: {
19- iterators :: { Pair , Pairs } ,
20- pratt_parser :: PrattParser ,
21- Parser ,
22- } ;
19+ use pest:: iterators :: { Pair , Pairs } ;
20+ use pest :: pratt_parser :: { Assoc , Op , PrattParser } ;
21+ use pest :: Parser ;
22+ use std :: cell :: { Cell , RefCell } ;
23+ use std :: collections :: HashMap ;
2324use std:: ffi:: CString ;
25+ use std:: hash:: Hash ;
2426use std:: rc:: Rc ;
2527use std:: str:: Chars ;
26- use std:: {
27- cell:: { Cell , RefCell } ,
28- collections:: HashMap ,
29- hash:: Hash ,
30- } ;
28+ use std:: sync:: LazyLock ;
3129
3230struct BuiltinFunctionInfo {
3331 function : BuiltinFunction ,
3432 min_args : u16 ,
3533 max_args : u16 ,
3634}
3735
38- lazy_static:: lazy_static! {
39- static ref BUILTIN_FUNCTIONS : HashMap <Rule , BuiltinFunctionInfo > = HashMap :: from( [
40- ( Rule :: atan2, BuiltinFunctionInfo {
41- function: BuiltinFunction :: Atan2 ,
42- min_args: 2 ,
43- max_args: 2 ,
44- } ) ,
45- ( Rule :: cos, BuiltinFunctionInfo {
46- function: BuiltinFunction :: Cos ,
47- min_args: 1 ,
48- max_args: 1 ,
49- } ) ,
50- ( Rule :: sin, BuiltinFunctionInfo {
51- function: BuiltinFunction :: Sin ,
52- min_args: 1 ,
53- max_args: 1 ,
54- } ) ,
55- ( Rule :: exp, BuiltinFunctionInfo {
56- function: BuiltinFunction :: Exp ,
57- min_args: 1 ,
58- max_args: 1 ,
59- } ) ,
60- ( Rule :: log, BuiltinFunctionInfo {
61- function: BuiltinFunction :: Log ,
62- min_args: 1 ,
63- max_args: 1 ,
64- } ) ,
65- ( Rule :: sqrt, BuiltinFunctionInfo {
66- function: BuiltinFunction :: Sqrt ,
67- min_args: 1 ,
68- max_args: 1 ,
69- } ) ,
70- ( Rule :: int, BuiltinFunctionInfo {
71- function: BuiltinFunction :: Int ,
72- min_args: 1 ,
73- max_args: 1 ,
74- } ) ,
75- ( Rule :: rand, BuiltinFunctionInfo {
76- function: BuiltinFunction :: Rand ,
77- min_args: 0 ,
78- max_args: 0 ,
79- } ) ,
80- ( Rule :: srand, BuiltinFunctionInfo {
81- function: BuiltinFunction :: Srand ,
82- min_args: 0 ,
83- max_args: 1 ,
84- } ) ,
85-
86- ( Rule :: gsub, BuiltinFunctionInfo {
87- function: BuiltinFunction :: Gsub ,
88- min_args: 2 ,
89- max_args: 3 ,
90- } ) ,
91- ( Rule :: index, BuiltinFunctionInfo {
92- function: BuiltinFunction :: Index ,
93- min_args: 2 ,
94- max_args: 2 ,
95- } ) ,
96- ( Rule :: length, BuiltinFunctionInfo {
97- function: BuiltinFunction :: Length ,
98- min_args: 0 ,
99- max_args: 1 ,
100- } ) ,
101- ( Rule :: match_fn, BuiltinFunctionInfo {
102- function: BuiltinFunction :: Match ,
103- min_args: 2 ,
104- max_args: 2 ,
105- } ) ,
106- ( Rule :: split, BuiltinFunctionInfo {
107- function: BuiltinFunction :: Split ,
108- min_args: 2 ,
109- max_args: 3 ,
110- } ) ,
111- ( Rule :: sprintf, BuiltinFunctionInfo {
112- function: BuiltinFunction :: Sprintf ,
113- min_args: 1 ,
114- max_args: u16 :: MAX ,
115- } ) ,
116- ( Rule :: sub, BuiltinFunctionInfo {
117- function: BuiltinFunction :: Sub ,
118- min_args: 2 ,
119- max_args: 3 ,
120- } ) ,
121- ( Rule :: substr, BuiltinFunctionInfo {
122- function: BuiltinFunction :: Substr ,
123- min_args: 2 ,
124- max_args: 3 ,
125- } ) ,
126- ( Rule :: tolower, BuiltinFunctionInfo {
127- function: BuiltinFunction :: ToLower ,
128- min_args: 1 ,
129- max_args: 1 ,
130- } ) ,
131- ( Rule :: toupper, BuiltinFunctionInfo {
132- function: BuiltinFunction :: ToUpper ,
133- min_args: 1 ,
134- max_args: 1 ,
135- } ) ,
136-
137- ( Rule :: close, BuiltinFunctionInfo {
138- function: BuiltinFunction :: Close ,
139- min_args: 1 ,
140- max_args: 1 ,
141- } ) ,
142- ( Rule :: fflush, BuiltinFunctionInfo {
143- function: BuiltinFunction :: FFlush ,
144- min_args: 0 ,
145- max_args: 1 ,
146- } ) ,
147- ( Rule :: system, BuiltinFunctionInfo {
148- function: BuiltinFunction :: System ,
149- min_args: 1 ,
150- max_args: 1 ,
151- } )
152- ] ) ;
153- }
154-
155- lazy_static:: lazy_static! {
156- static ref PRATT_PARSER : PrattParser <Rule > = {
157- use pest:: pratt_parser:: { Assoc , Op } ;
36+ static BUILTIN_FUNCTIONS : LazyLock < HashMap < Rule , BuiltinFunctionInfo > > = LazyLock :: new ( || {
37+ HashMap :: from ( [
38+ (
39+ Rule :: atan2,
40+ BuiltinFunctionInfo {
41+ function : BuiltinFunction :: Atan2 ,
42+ min_args : 2 ,
43+ max_args : 2 ,
44+ } ,
45+ ) ,
46+ (
47+ Rule :: cos,
48+ BuiltinFunctionInfo {
49+ function : BuiltinFunction :: Cos ,
50+ min_args : 1 ,
51+ max_args : 1 ,
52+ } ,
53+ ) ,
54+ (
55+ Rule :: sin,
56+ BuiltinFunctionInfo {
57+ function : BuiltinFunction :: Sin ,
58+ min_args : 1 ,
59+ max_args : 1 ,
60+ } ,
61+ ) ,
62+ (
63+ Rule :: exp,
64+ BuiltinFunctionInfo {
65+ function : BuiltinFunction :: Exp ,
66+ min_args : 1 ,
67+ max_args : 1 ,
68+ } ,
69+ ) ,
70+ (
71+ Rule :: log,
72+ BuiltinFunctionInfo {
73+ function : BuiltinFunction :: Log ,
74+ min_args : 1 ,
75+ max_args : 1 ,
76+ } ,
77+ ) ,
78+ (
79+ Rule :: sqrt,
80+ BuiltinFunctionInfo {
81+ function : BuiltinFunction :: Sqrt ,
82+ min_args : 1 ,
83+ max_args : 1 ,
84+ } ,
85+ ) ,
86+ (
87+ Rule :: int,
88+ BuiltinFunctionInfo {
89+ function : BuiltinFunction :: Int ,
90+ min_args : 1 ,
91+ max_args : 1 ,
92+ } ,
93+ ) ,
94+ (
95+ Rule :: rand,
96+ BuiltinFunctionInfo {
97+ function : BuiltinFunction :: Rand ,
98+ min_args : 0 ,
99+ max_args : 0 ,
100+ } ,
101+ ) ,
102+ (
103+ Rule :: srand,
104+ BuiltinFunctionInfo {
105+ function : BuiltinFunction :: Srand ,
106+ min_args : 0 ,
107+ max_args : 1 ,
108+ } ,
109+ ) ,
110+ (
111+ Rule :: gsub,
112+ BuiltinFunctionInfo {
113+ function : BuiltinFunction :: Gsub ,
114+ min_args : 2 ,
115+ max_args : 3 ,
116+ } ,
117+ ) ,
118+ (
119+ Rule :: index,
120+ BuiltinFunctionInfo {
121+ function : BuiltinFunction :: Index ,
122+ min_args : 2 ,
123+ max_args : 2 ,
124+ } ,
125+ ) ,
126+ (
127+ Rule :: length,
128+ BuiltinFunctionInfo {
129+ function : BuiltinFunction :: Length ,
130+ min_args : 0 ,
131+ max_args : 1 ,
132+ } ,
133+ ) ,
134+ (
135+ Rule :: match_fn,
136+ BuiltinFunctionInfo {
137+ function : BuiltinFunction :: Match ,
138+ min_args : 2 ,
139+ max_args : 2 ,
140+ } ,
141+ ) ,
142+ (
143+ Rule :: split,
144+ BuiltinFunctionInfo {
145+ function : BuiltinFunction :: Split ,
146+ min_args : 2 ,
147+ max_args : 3 ,
148+ } ,
149+ ) ,
150+ (
151+ Rule :: sprintf,
152+ BuiltinFunctionInfo {
153+ function : BuiltinFunction :: Sprintf ,
154+ min_args : 1 ,
155+ max_args : u16:: MAX ,
156+ } ,
157+ ) ,
158+ (
159+ Rule :: sub,
160+ BuiltinFunctionInfo {
161+ function : BuiltinFunction :: Sub ,
162+ min_args : 2 ,
163+ max_args : 3 ,
164+ } ,
165+ ) ,
166+ (
167+ Rule :: substr,
168+ BuiltinFunctionInfo {
169+ function : BuiltinFunction :: Substr ,
170+ min_args : 2 ,
171+ max_args : 3 ,
172+ } ,
173+ ) ,
174+ (
175+ Rule :: tolower,
176+ BuiltinFunctionInfo {
177+ function : BuiltinFunction :: ToLower ,
178+ min_args : 1 ,
179+ max_args : 1 ,
180+ } ,
181+ ) ,
182+ (
183+ Rule :: toupper,
184+ BuiltinFunctionInfo {
185+ function : BuiltinFunction :: ToUpper ,
186+ min_args : 1 ,
187+ max_args : 1 ,
188+ } ,
189+ ) ,
190+ (
191+ Rule :: close,
192+ BuiltinFunctionInfo {
193+ function : BuiltinFunction :: Close ,
194+ min_args : 1 ,
195+ max_args : 1 ,
196+ } ,
197+ ) ,
198+ (
199+ Rule :: fflush,
200+ BuiltinFunctionInfo {
201+ function : BuiltinFunction :: FFlush ,
202+ min_args : 0 ,
203+ max_args : 1 ,
204+ } ,
205+ ) ,
206+ (
207+ Rule :: system,
208+ BuiltinFunctionInfo {
209+ function : BuiltinFunction :: System ,
210+ min_args : 1 ,
211+ max_args : 1 ,
212+ } ,
213+ ) ,
214+ ] )
215+ } ) ;
158216
159- // Precedence is defined lowest to highest
160- PrattParser :: new( )
217+ static PRATT_PARSER : LazyLock < PrattParser < Rule > > = LazyLock :: new ( || {
218+ // Precedence is defined lowest to highest
219+ PrattParser :: new ( )
161220 . op ( Op :: infix ( Rule :: or, Assoc :: Left ) )
162221 . op ( Op :: infix ( Rule :: and, Assoc :: Left ) )
163- . op( Op :: infix( Rule :: in_op, Assoc :: Left ) )
164- . op( Op :: infix( Rule :: match_op, Assoc :: Left )
165- | Op :: infix( Rule :: not_match, Assoc :: Left ) )
222+ . op ( Op :: infix ( Rule :: in_op, Assoc :: Left ) )
223+ . op ( Op :: infix ( Rule :: match_op, Assoc :: Left ) | Op :: infix ( Rule :: not_match, Assoc :: Left ) )
166224 . op ( Op :: infix ( Rule :: comp_op, Assoc :: Left ) )
167225 . op ( Op :: infix ( Rule :: concat, Assoc :: Left ) )
168- . op( Op :: infix( Rule :: add, Assoc :: Left )
169- | Op :: infix( Rule :: binary_sub, Assoc :: Left ) )
226+ . op ( Op :: infix ( Rule :: add, Assoc :: Left ) | Op :: infix ( Rule :: binary_sub, Assoc :: Left ) )
170227 . op ( Op :: infix ( Rule :: mul, Assoc :: Left )
171228 | Op :: infix ( Rule :: div, Assoc :: Left )
172229 | Op :: infix ( Rule :: modulus, Assoc :: Left ) )
173- . op( Op :: prefix( Rule :: not)
174- | Op :: prefix( Rule :: negate)
175- | Op :: prefix( Rule :: unary_plus) )
230+ . op ( Op :: prefix ( Rule :: not) | Op :: prefix ( Rule :: negate) | Op :: prefix ( Rule :: unary_plus) )
176231 . op ( Op :: infix ( Rule :: pow, Assoc :: Right ) )
177- . op( Op :: prefix( Rule :: pre_inc)
178- | Op :: prefix( Rule :: pre_dec) )
179- . op( Op :: postfix( Rule :: post_inc)
180- | Op :: postfix( Rule :: post_dec) )
181- } ;
182- }
232+ . op ( Op :: prefix ( Rule :: pre_inc) | Op :: prefix ( Rule :: pre_dec) )
233+ . op ( Op :: postfix ( Rule :: post_inc) | Op :: postfix ( Rule :: post_dec) )
234+ } ) ;
183235
184236#[ derive( pest_derive:: Parser , Default ) ]
185237#[ grammar = "grammar.pest" ]
0 commit comments