drop_parens {lazy.symbolic}R Documentation

drop parens

Description

Remove unnecessary parentheses from an expression#'

Usage

drop_parens(expr, all = FALSE, in_biop = FALSE)

Arguments

expr

an expression or a string

all

= TRUE if all parens should be removed from ast.
= FALSE if 二項演算子同士の順序関係を明示したい場合。

in_biop

flag for recursive process.

Value

an expression

Examples


modify_math_operators()
# example code
drop_parens("X")
drop_parens("(X)")
drop_parens("((X))")
drop_parens("(t((X)))")
drop_parens("(t((tr((X)))))") |> show_ast()
drop_parens("(t((tr((X)))))") |> show_ast()
drop_parens("(A*B)")

# examples for all
drop_parens("((A%*%(B*((C%*%C)))))") |> show_ast()
drop_parens("((A%*%(B*((C%*%C)))))", all = TRUE)|> show_ast()

drop_parens("((A%*%(B*((C%*%C)))))") |> show_ast()
drop_parens("((A%*%(B*((C%*%C)))))", all = TRUE)|> show_ast()



expr <- easy_parse("(X*A)%*%C") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
expr <- easy_parse("C%*%(X*A)") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
expr <- easy_parse("(X%*%A)*C") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
expr <- easy_parse("C*(X%*%A)") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
expr <- easy_parse("C%*%(X%*%A)") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
expr <- easy_parse("(C%*%X)%*%A") ; expr |> show_ast()
drop_parens(expr) |> show_ast()

# かっこに対する考察
easy_parse("X%*%B%*%C") |> show_ast()
easy_parse("(X%*%B)%*%C") |> show_ast()
easy_parse("(X*B)%*%C") |> show_ast()
easy_parse("X*B%*%C") |> show_ast() # %*%が*よりも優先度高い

# second factor
expr <- easy_parse("A%*%C") ; expr |> show_ast()
expr[[3]] <- easy_parse("X%*%B"); show_ast(expr)
expr[[3]] <- easy_parse("(X%*%B)"); show_ast(expr)

# first factor
expr <- easy_parse("A%*%C") ; expr |> show_ast()
expr[[2]] <- easy_parse("X%*%B"); show_ast(expr)
expr[[2]] <- easy_parse("(X%*%B)"); show_ast(expr)

#つまり
#1. 構文木に代入する場合は、
#   1.1. 左から順にの計算順序から変わる場合は、見た目上の () がつく。
# そうでない場合は()なし。
#  1.2. ()を明示的に入れた場合はちゃんと実際の構文木上も現れる。
#2. 必要不要問わず、"()" 付きをパースすると、必ず () が構文木に現れる。

expr <- easy_parse("A*C") ; expr |> show_ast()
expr[[2]] <- easy_parse("X%*%B"); show_ast(expr)
expr[[2]] <- easy_parse("(X%*%B)"); show_ast(expr)

expr <- easy_parse("A*C") ; expr |> show_ast()
expr[[3]] <- easy_parse("X%*%B"); show_ast(expr)
expr[[3]] <- easy_parse("(X%*%B)"); show_ast(expr)

expr <- easy_parse("A%*%C") ; expr |> show_ast()
expr[[2]] <- easy_parse("X*B"); show_ast(expr)
expr[[2]] <- easy_parse("(X*B)"); show_ast(expr)

expr <- easy_parse("A%*%C") ; expr |> show_ast()
expr[[3]] <- easy_parse("X*B"); show_ast(expr)
expr[[3]] <- easy_parse("(X*B)"); show_ast(expr)

expr <- easy_parse("(X*A)%*%C") ; expr |> show_ast()
expr <- easy_parse("C%*%(X*A)") ; expr |> show_ast()

# ということは、構文木上では一度かっこをほぼすべて外しても問題ない。(はず)

easy_parse("X%*%(B*C)") |> show_ast() # %*%が*よりも優先度高い
easy_parse("X%*%B*C") |> show_ast() # %*%が*よりも優先度高い
easy_parse("X%*%B*C") |> show_ast() # %*%が*よりも優先度高い


[Package lazy.symbolic version 1.0.0.20250803 ]