[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/j-emils/OMPython/master/OMPython/OMTypedParser.py [Back]  [Original]

# -*- coding: utf-8 -*-
__author__ = "Anand Kalaiarasi Ganeson, ganan642@student.liu.se, 2012-03-19, and Martin Sjlund"
__license__ = """
 This file is part of OpenModelica.

 Copyright (c) 1998-CurrentYear, Open Source Modelica Consortium (OSMC),
 c/o Linkpings universitet, Department of Computer and Information Science,
 SE-58183 Linkping, Sweden.

 All rights reserved.

 THIS PROGRAM IS PROVIDED UNDER THE TERMS OF THE BSD NEW LICENSE OR THE
 GPL VERSION 3 LICENSE OR THE OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.2.
 ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES
 RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GPL VERSION 3,
 ACCORDING TO RECIPIENTS CHOICE.

 The OpenModelica software and the OSMC (Open Source Modelica Consortium)
 Public License (OSMC-PL) are obtained from OSMC, either from the above
 address, from the URLs: http://www.openmodelica.org or
 http://www.ida.liu.se/projects/OpenModelica, and in the OpenModelica
 distribution. GNU version 3 is obtained from:
 http://www.gnu.org/copyleft/gpl.html. The New BSD License is obtained from:
 http://www.opensource.org/licenses/BSD-3-Clause.

 This program is distributed WITHOUT ANY WARRANTY; without even the implied
 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, EXCEPT AS
 EXPRESSLY SET FORTH IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE
 CONDITIONS OF OSMC-PL.
"""
__status__ = "Prototype"
__maintainer__ = "https://openmodelica.org"

from typing import Any

from pyparsing import (
    Combine,
    Dict,
    Forward,
    Group,
    Keyword,
    Optional,
    QuotedString,
    StringEnd,
    Suppress,
    Word,
    alphanums,
    alphas,
    delimitedList,
    nums,
    replaceWith,
    infixNotation,
    opAssoc,
)


def convert_numbers(s, loc, toks):
    n = toks[0]
    try:
        return int(n)
    except ValueError:
        return float(n)


def convert_string2(s, s2):
    tmp = s2[0].replace("\\\"", "\"")
    tmp = tmp.replace("\"", "\\\"")
    tmp = tmp.replace("\'", "\\'")
    tmp = tmp.replace("\f", "\\f")
    tmp = tmp.replace("\n", "\\n")
    tmp = tmp.replace("\r", "\\r")
    tmp = tmp.replace("\t", "\\t")
    return "'" + tmp + "'"


def convert_string(s, s2):
    return s2[0].replace("\\\"", '"')


def convert_dict(d):
    return dict(d[0])


def convert_tuple(t):
    return tuple(t[0])


def evaluate_expression(s, loc, toks):
    # Convert the tokens (ParseResults) into a string expression
    flat_list = [item for sublist in toks[0] for item in sublist]
    expr = "".join(flat_list)
    try:
        # Evaluate the expression safely
        return eval(expr)
    except (SyntaxError, NameError):
        return expr


# Number parsing (supports arithmetic expressions in dimensions) (e.g., {1 + 1, 1})
arrayDimension = infixNotation(
    Word(alphas + "_", alphanums + "_") | Word(nums),
    [
        (Word("+-", exact=1), 1, opAssoc.RIGHT),
        (Word("*/", exact=1), 2, opAssoc.LEFT),
        (Word("+-", exact=1), 2, opAssoc.LEFT),
    ],
).set_parse_action(evaluate_expression)

omcRecord = Forward()
omcValue = Forward()

# pyparsing's replace_with (and thus replaceWith) has incorrect type
# annotation: https://github.com/pyparsing/pyparsing/issues/602
TRUE = Keyword("true").set_parse_action(replaceWith(True))  # type: ignore
FALSE = Keyword("false").set_parse_action(replaceWith(False))  # type: ignore
NONE = (Keyword("NONE") + Suppress("(") + Suppress(")")).set_parse_action(replaceWith(None))  # type: ignore
SOME = (Suppress(Keyword("SOME")) + Suppress("(") + omcValue + Suppress(")"))

omcString = QuotedString(quoteChar='"', escChar='\\', multiline=True).set_parse_action(convert_string)
omcNumber = Combine(Optional('-') + ('0' | Word('123456789', nums)) +
                    Optional('.' + Word(nums)) +
                    Optional(Word('eE', exact=1) + Word(nums + '+-', nums)))

# ident = Word(alphas + "_", alphanums + "_") | Combine("'" + Word(alphanums + "!#$%&()*+,-./:;=?@[]^{}|~ ") + "'")
ident = (Word(alphas + "_", alphanums + "_")
         | QuotedString(quoteChar='\'', escChar='\\').set_parse_action(convert_string2))
fqident = Forward()
fqident 

Web Proxy Viewer  |  New URL  |  Original Page