55import os
66import sys
77import io
8- import re
98import builtins
109import functools
1110from sympy import Matrix , Basic , S , Symbol , Function , Derivative , Pow
2726
2827from inspect import getouterframes , currentframe
2928
29+ from ._utils import parser as _parser
30+
3031ZERO_STR = ' 0 '
3132
3233Format_cnt = 0
@@ -1181,18 +1182,7 @@ def Print_Function():
11811182 return
11821183
11831184
1184- op_cntrct = re .compile (r'(([A-Za-z0-9\_\#]+)(\||<|>)([A-Za-z0-9\_\#]+))' )
1185- op_wedge = re .compile (r'(([A-Za-z0-9\_\#]+)[\^]{1}([A-Za-z0-9\_\#]+)([\^]{1}([A-Za-z0-9\_\#]+))*)' )
1186- ops = r'[\^\|\<\>]+'
1187- ops_search = re .compile (r'(\^|\||<|>)+' )
1188- parse_paren_calls = 0
11891185global_dict = {}
1190- op_dict = {}
1191- op_lst = []
1192-
1193- OPS = {'<>|' : r'(([A-Za-z0-9\_\#]+)(\||<|>)([A-Za-z0-9\_\#]+))' ,
1194- '^' : r'(([A-Za-z0-9\_\#]+)[\^]{1}([A-Za-z0-9\_\#]+)([\^]{1}([A-Za-z0-9\_\#]+))*)' ,
1195- '*' : r'(([A-Za-z0-9\_\#]+)[\*]{1}([A-Za-z0-9\_\#]+)([\*]{1}([A-Za-z0-9\_\#]+))*)' }
11961186
11971187
11981188def def_prec (gd : dict , op_ord : str = '<>|,^,*' ) -> None :
@@ -1207,159 +1197,9 @@ def def_prec(gd: dict, op_ord: str = '<>|,^,*') -> None:
12071197 The order of operator precedence from high to low with groups of equal precedence separated by commas.
12081198 The default precedence, ``'<>|,^,*'``, is that used by Hestenes (:cite:`Hestenes`, p7, :cite:`Doran`, p38).
12091199 """
1210- global global_dict , op_dict , op_lst
1200+ global global_dict
12111201 global_dict = gd
1212- op_lst = op_ord .split (',' )
1213- op_dict = {}
1214- for op in op_lst :
1215- op_dict [op ] = re .compile (OPS [op ])
1216- return
1217-
1218-
1219- def contains_interval (interval1 , interval2 ): # interval1 inside interval2
1220- if interval1 [0 ] > interval2 [0 ] and interval1 [1 ] < interval2 [1 ]:
1221- return True
1222- else :
1223- return False
1224-
1225-
1226- def parse_paren (line ):
1227- global parse_paren_calls
1228- parse_paren_calls += 1
1229-
1230- if ('(' not in line ) or (')' not in line ):
1231- return [[[line ]]]
1232- level = 0
1233- max_level = 0
1234- ich = 0
1235- paren_lst = []
1236- for ch in line :
1237- if ch == '(' :
1238- level += 1
1239- paren_lst .append ([level , ich ])
1240- if ch == ')' :
1241- if level < 1 :
1242- raise ValueError ('Mismathed Parenthesis in: ' + line + '\n ' )
1243- paren_lst .reverse ()
1244- iparen = 0
1245- for elem in paren_lst :
1246- if elem [0 ] == level :
1247- paren_lst [iparen ].append (ich )
1248- break
1249- iparen += 1
1250- paren_lst .reverse ()
1251- level -= 1
1252- max_level = max (max_level , level )
1253- ich += 1
1254- if level != 0 :
1255- raise ValueError ('Mismatched Parenthesis in: ' + line + '\n ' )
1256- if max_level > 0 :
1257- level_lst = []
1258- for _x in range (max_level + 1 ):
1259- level_lst .append ([])
1260- for group in paren_lst :
1261- level_lst [group [0 ]].append (group [1 :])
1262- ilevel = max_level
1263- while ilevel > 1 :
1264- level = level_lst [ilevel ]
1265- level_down = level_lst [ilevel - 1 ]
1266- igroup = 0
1267- for group in level :
1268- igroup_down = 0
1269- for group_down in level_down :
1270- if contains_interval (group , group_down ):
1271- level_lst [ilevel ][igroup ].append (igroup_down )
1272- igroup_down += 1
1273- igroup += 1
1274- ilevel -= 1
1275- ilevel = 1
1276- for level in level_lst [1 :]:
1277- igroup = 0
1278- for group in level :
1279- token = '#' + str (parse_paren_calls ) + '_' + str (ilevel ) + '_' + str (igroup ) + '#'
1280- level_lst [ilevel ][igroup ].append (line [group [0 ]:group [1 ] + 1 ])
1281- level_lst [ilevel ][igroup ].append (token )
1282- igroup += 1
1283- ilevel += 1
1284- ilevel = 1
1285- for level in level_lst [1 :]:
1286- igroup = 0
1287- for group in level :
1288- group .append (group [- 2 ])
1289- level_lst [ilevel ][igroup ] = group
1290- igroup += 1
1291- ilevel += 1
1292- ilevel = max_level
1293- while ilevel > 1 :
1294- igroup = 0
1295- for group in level_lst [ilevel ]:
1296- group_down = level_lst [ilevel - 1 ][group [2 ]]
1297- replace_text = group_down [- 1 ].replace (group [- 3 ], group [- 2 ])
1298- level_lst [ilevel - 1 ][group [2 ]][- 1 ] = replace_text
1299- igroup += 1
1300- ilevel -= 1
1301- for group in level_lst [1 ]:
1302- line = line .replace (group [2 ], group [3 ])
1303- ilevel = 1
1304- level_lst [0 ] = [[line ]]
1305- return level_lst
1306-
1307-
1308- def unparse_paren (level_lst ):
1309- line = level_lst [0 ][0 ][0 ]
1310- for level in level_lst [1 :]:
1311- for group in level :
1312- new_string = group [- 1 ]
1313- if new_string [:2 ] == '((' and new_string [- 2 :] == '))' :
1314- new_string = new_string [1 :- 1 ]
1315- line = line .replace (group [- 2 ], new_string )
1316- return line
1317-
1318-
1319- def sub_paren (s ):
1320- string = s .group (0 )
1321- return '(%s)' % string
1322-
1323-
1324- def add_paren (line , re_exprs ):
1325- paren_flg = False
1326- if (line [0 ] == '(' ) and (line [- 1 ] == ')' ):
1327- paren_flg = True
1328- line = line [1 :- 1 ]
1329- if ('(' in line ) or (')' in line ):
1330- line_levels = parse_paren (line )
1331- ilevel = 0
1332- for level in line_levels :
1333- igroup = 0
1334- for group in level :
1335- group [- 1 ] = re .sub (re_exprs , sub_paren , group [- 1 ])
1336- line_levels [ilevel ][igroup ] = group
1337- igroup += 1
1338- ilevel += 1
1339- line = unparse_paren (line_levels )
1340- else :
1341- line = re .sub (re_exprs , sub_paren , line )
1342- if paren_flg :
1343- line = '(' + line + ')'
1344- return line
1345-
1346-
1347- def parse_line (line ):
1348- global op_lst , op_dict
1349- line = line .replace (' ' , '' )
1350- level_lst = parse_paren (line )
1351- ilevel = 0
1352- for level in level_lst :
1353- igroup = 0
1354- for group in level :
1355- string = group [- 1 ]
1356- for op in op_lst :
1357- string = add_paren (string , op_dict [op ])
1358- level_lst [ilevel ][igroup ][- 1 ] = string
1359- igroup += 1
1360- ilevel += 1
1361- line = unparse_paren (level_lst )
1362- return line
1202+ _parser .set_precedence (op_ord )
13631203
13641204
13651205def GAeval (s : str , pstr : bool = False ):
@@ -1379,12 +1219,13 @@ def GAeval(s: str, pstr: bool = False):
13791219 enforce operator precedence are printed.
13801220 """
13811221
1382- seval = parse_line (s )
1222+ seval = _parser . parse_line (s )
13831223 if pstr :
13841224 print (s )
13851225 print (seval )
13861226 return eval (seval , global_dict )
13871227
1228+
13881229r"""
13891230\begin{array}{c}
13901231\left ( \begin{array}{c} F,\\ \end{array} \right . \\
0 commit comments