Skip to content

Commit 96de061

Browse files
authored
Merge branch 'master' into dependabot/github_actions/actions/setup-python-5
2 parents 6fbebf4 + 5368216 commit 96de061

5 files changed

Lines changed: 494 additions & 321 deletions

File tree

OMPython/OMTypedParser.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@
5353
delimitedList,
5454
nums,
5555
replaceWith,
56+
infixNotation,
57+
opAssoc,
5658
)
5759

5860
import 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+
90113
omcRecord = Forward()
91114
omcValue = Forward()
92115

@@ -107,7 +130,8 @@ def convertTuple(t):
107130
omcValues = delimitedList(omcValue)
108131
omcTuple = Group(Suppress('(') + Optional(omcValues) + Suppress(')')).setParseAction(convertTuple)
109132
omcArray = 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))
111135
recordMember = delimitedList(Group(ident + Suppress('=') + omcValue))
112136
omcRecord << Group(Suppress('record') + Suppress(fqident) + Dict(recordMember) + Suppress('end') + Suppress(fqident) + Suppress(';')).setParseAction(convertDict)
113137

0 commit comments

Comments
 (0)