MCPcopy Create free account
hub / github.com/ControlCplusControlV/Scribe / parse_expression

Function parse_expression

crates/papyrus/src/parser.rs:247–314  ·  view source on GitHub ↗

Function to parse grammar within an expression rule

(expression: Pair<Rule>)

Source from the content-addressed store, hash-verified

245
246//Function to parse grammar within an expression rule
247fn parse_expression(expression: Pair<Rule>) -> Expr {
248 let expression = expression.clone().into_inner().next().unwrap();
249 match expression.as_rule() {
250 Rule::literal => {
251 // Parsing literals need to recurse because it could be a number literal
252 Expr::Literal(parse_literal(expression))
253 }
254 Rule::number_literal => parse_expression(expression),
255 Rule::hex_number => {
256 // TODO: parse hex numbers
257 let initial = expression.as_str();
258 Expr::Literal(ExprLiteral::Number(ExprLiteralNumber {
259 inferred_type: None,
260 value: U256::from_str_radix(initial, 16).unwrap(),
261 }))
262 }
263 Rule::hex_literal => {
264 // TODO: parse hex numbers
265 let initial = expression.as_str();
266 Expr::Literal(ExprLiteral::Number(ExprLiteralNumber {
267 inferred_type: None,
268 value: U256::from_str_radix(initial, 16).unwrap(),
269 }))
270 }
271 Rule::decimal_number => {
272 let i = expression.as_str();
273 Expr::Literal(ExprLiteral::Number(ExprLiteralNumber {
274 inferred_type: None,
275 value: U256::from_dec_str(i).unwrap(),
276 }))
277 }
278 Rule::string_literal => {
279 let content = expression.into_inner().next().unwrap();
280 Expr::Literal(ExprLiteral::String(content.as_str().to_string()))
281 }
282
283 // //rule is a false literal
284 // Rule::false_literal => Expr::Bool(false),
285
286 // //rule is a true literal
287 // Rule::true_literal => Expr::Bool(true),
288
289 //if the matched rule is an identifier
290 Rule::identifier => parse_identifier(expression),
291
292 //if the matched rule is a function call
293 Rule::function_call => {
294 let mut inners = expression.into_inner();
295 let function_name = inners.next().unwrap().as_str();
296 let mut exprs: Vec<Expr> = Vec::new();
297 // for each argument in the function, parse the expression and add it to exprs
298 for arg in inners {
299 exprs.push(parse_expression(arg));
300 }
301 Expr::FunctionCall(ExprFunctionCall {
302 function_name: function_name.to_string(),
303 exprs: Box::new(exprs),
304 inferred_return_types: vec![],

Callers 2

parse_statementFunction · 0.85
parse_literalFunction · 0.85

Calls 3

parse_literalFunction · 0.85
parse_identifierFunction · 0.85
pushMethod · 0.80

Tested by

no test coverage detected