5353 delimitedList ,
5454 nums ,
5555 replaceWith ,
56+ infixNotation ,
57+ opAssoc ,
5658)
5759
5860import sys
@@ -87,6 +89,28 @@ 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 as e :
101+ print (f"Error evaluating expression: { expr } " )
102+ return None
103+
104+ # Number parsing (supports arithmetic expressions in dimensions) (e.g., {1 + 1, 1})
105+ arrayDimension = infixNotation (
106+ Word (nums ),
107+ [
108+ (Word ("+-" , exact = 1 ), 1 , opAssoc .RIGHT ),
109+ (Word ("*/" , exact = 1 ), 2 , opAssoc .LEFT ),
110+ (Word ("+-" , exact = 1 ), 2 , opAssoc .LEFT ),
111+ ],
112+ ).setParseAction (evaluateExpression )
113+
90114omcRecord = Forward ()
91115omcValue = Forward ()
92116
@@ -107,7 +131,8 @@ def convertTuple(t):
107131omcValues = delimitedList (omcValue )
108132omcTuple = Group (Suppress ('(' ) + Optional (omcValues ) + Suppress (')' )).setParseAction (convertTuple )
109133omcArray = Group (Suppress ('{' ) + Optional (omcValues ) + Suppress ('}' )).setParseAction (convertTuple )
110- omcValue << (omcString | omcNumber | omcRecord | omcArray | omcTuple | SOME | TRUE | FALSE | NONE | Combine (fqident ))
134+ omcArraySpecialTypes = Group (Suppress ('{' ) + delimitedList (arrayDimension ) + Suppress ('}' )).setParseAction (convertTuple )
135+ omcValue << (omcString | omcNumber | omcRecord | omcArray | omcArraySpecialTypes | omcTuple | SOME | TRUE | FALSE | NONE | Combine (fqident ))
111136recordMember = delimitedList (Group (ident + Suppress ('=' ) + omcValue ))
112137omcRecord << Group (Suppress ('record' ) + Suppress (fqident ) + Dict (recordMember ) + Suppress ('end' ) + Suppress (fqident ) + Suppress (';' )).setParseAction (convertDict )
113138
0 commit comments