# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Utility function to parse text into an ir_pb2.Expression."""

from compiler.front_end import module_ir
from compiler.front_end import parser
from compiler.front_end import tokenizer


def parse(text):
  """Parses text as an Expression.

  This parses text using the expression subset of the Emboss grammar, and
  returns an ir_pb2.Expression.  The expression only needs to be syntactically
  valid; it will not go through symbol resolution or type checking.  This
  function is not intended to be called on arbitrary input; it asserts that the
  text successfully parses, but does not return errors.

  Arguments:
    text: The text of an Emboss expression, like "4 + 5" or "$max(1, a, b)".

  Returns:
    An ir_pb2.Expression corresponding to the textual form.

  Raises:
    AssertionError if text is not a well-formed Emboss expression, and
    assertions are enabled.
  """
  tokens, errors = tokenizer.tokenize(text, "")
  assert not errors, "{!r}".format(errors)
  # tokenizer.tokenize always inserts a newline token at the end, which breaks
  # expression parsing.
  parse_result = parser.parse_expression(tokens[:-1])
  assert not parse_result.error, "{!r}".format(parse_result.error)
  return module_ir.build_ir(parse_result.parse_tree)
