5353 delimitedList ,
5454 nums ,
5555 replaceWith ,
56+ infixNotation ,
57+ opAssoc ,
5658)
5759
5860import sys
@@ -87,6 +89,27 @@ def convertTuple(t):
8789 return tuple (t [0 ])
8890
8991
92+
93+ def evaluateExpression (s , loc , toks ):
94+ # Convert the tokens (ParseResults) into a string expression
95+ flat_list = [item for sublist in toks [0 ] for item in sublist ]
96+ expr = "" .join (flat_list )
97+ try :
98+ # Evaluate the expression safely
99+ return eval (expr )
100+ except Exception :
101+ return expr
102+
103+ # Number parsing (supports arithmetic expressions in dimensions) (e.g., {1 + 1, 1})
104+ arrayDimension = infixNotation (
105+ Word (alphas + "_" , alphanums + "_" ) | Word (nums ),
106+ [
107+ (Word ("+-" , exact = 1 ), 1 , opAssoc .RIGHT ),
108+ (Word ("*/" , exact = 1 ), 2 , opAssoc .LEFT ),
109+ (Word ("+-" , exact = 1 ), 2 , opAssoc .LEFT ),
110+ ],
111+ ).setParseAction (evaluateExpression )
112+
90113omcRecord = Forward ()
91114omcValue = Forward ()
92115
@@ -107,7 +130,8 @@ def convertTuple(t):
107130omcValues = delimitedList (omcValue )
108131omcTuple = Group (Suppress ('(' ) + Optional (omcValues ) + Suppress (')' )).setParseAction (convertTuple )
109132omcArray = Group (Suppress ('{' ) + Optional (omcValues ) + Suppress ('}' )).setParseAction (convertTuple )
110- omcValue << (omcString | omcNumber | omcRecord | omcArray | omcTuple | SOME | TRUE | FALSE | NONE | Combine (fqident ))
133+ omcArraySpecialTypes = Group (Suppress ('{' ) + delimitedList (arrayDimension ) + Suppress ('}' )).setParseAction (convertTuple )
134+ omcValue << (omcString | omcNumber | omcRecord | omcArray | omcArraySpecialTypes | omcTuple | SOME | TRUE | FALSE | NONE | Combine (fqident ))
111135recordMember = delimitedList (Group (ident + Suppress ('=' ) + omcValue ))
112136omcRecord << Group (Suppress ('record' ) + Suppress (fqident ) + Dict (recordMember ) + Suppress ('end' ) + Suppress (fqident ) + Suppress (';' )).setParseAction (convertDict )
113137
0 commit comments