| # 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_data.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_data.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_data.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) |