Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| # This file was generated by Hermes Parser Generator on Tue May 9 17:05:55 2017 | |
| # | |
| # Hermes command: hermes generate ../grammar.hgr --language=python --name=wdl --header --directory . | |
| # Run from: . (relative to this file) | |
| # Hermes version: hermes-parser 2.0rc6 | |
| # | |
| # !!! DO NOT CHANGE THIS FILE DIRECTLY !!! | |
| # | |
| # If you wish to change something in this file, either change the grammar and | |
| # re-generate this file, or change the templates in Hermes and regenerate. | |
| # See the Hermes repository: http://github.com/scottfrazer/hermes | |
| import sys | |
| import os | |
| import re | |
| import base64 | |
| import argparse | |
| from collections import OrderedDict | |
| # Common Code # | |
| def parse_tree_string(parsetree, indent=None, b64_source=True, indent_level=0, debug=False): | |
| indent_str = (' ' * indent * indent_level) if indent else '' | |
| if isinstance(parsetree, ParseTree): | |
| children = [parse_tree_string(child, indent, b64_source, indent_level+1, debug) for child in parsetree.children] | |
| debug_str = parsetree.debug_str() if debug else '' | |
| if indent is None or len(children) == 0: | |
| return '{0}({1}: {2}{3})'.format(indent_str, parsetree.nonterminal, debug_str, ', '.join(children)) | |
| else: | |
| return '{0}({1}:{2}\n{3}\n{4})'.format( | |
| indent_str, | |
| parsetree.nonterminal, | |
| debug_str, | |
| ',\n'.join(children), | |
| indent_str | |
| ) | |
| elif isinstance(parsetree, Terminal): | |
| return indent_str + parsetree.dumps(b64_source=b64_source) | |
| def ast_string(ast, indent=None, b64_source=True, indent_level=0): | |
| indent_str = (' ' * indent * indent_level) if indent else '' | |
| next_indent_str = (' ' * indent * (indent_level+1)) if indent else '' | |
| if isinstance(ast, Ast): | |
| children = OrderedDict([(k, ast_string(v, indent, b64_source, indent_level+1)) for k, v in ast.attributes.items()]) | |
| if indent is None: | |
| return '({0}: {1})'.format( | |
| ast.name, | |
| ', '.join('{0}={1}'.format(k, v) for k, v in children.items()) | |
| ) | |
| else: | |
| return '({0}:\n{1}\n{2})'.format( | |
| ast.name, | |
| ',\n'.join(['{0}{1}={2}'.format(next_indent_str, k, v) for k, v in children.items()]), | |
| indent_str | |
| ) | |
| elif isinstance(ast, list): | |
| children = [ast_string(element, indent, b64_source, indent_level+1) for element in ast] | |
| if indent is None or len(children) == 0: | |
| return '[{0}]'.format(', '.join(children)) | |
| else: | |
| return '[\n{1}\n{0}]'.format( | |
| indent_str, | |
| ',\n'.join(['{0}{1}'.format(next_indent_str, child) for child in children]), | |
| ) | |
| elif isinstance(ast, Terminal): | |
| return ast.dumps(b64_source=b64_source) | |
| class Terminal: | |
| def __init__(self, id, str, source_string, resource, line, col): | |
| self.__dict__.update(locals()) | |
| def getId(self): | |
| return self.id | |
| def ast(self): | |
| return self | |
| def dumps(self, b64_source=True, **kwargs): | |
| source_string = base64.b64encode(self.source_string.encode('utf-8')).decode('utf-8') if b64_source else self.source_string | |
| return '<{resource}:{line}:{col} {terminal} "{source}">'.format( | |
| resource=self.resource, | |
| line=self.line, | |
| col=self.col, | |
| terminal=self.str, | |
| source=source_string | |
| ) | |
| def __str__(self): | |
| return self.dumps() | |
| class NonTerminal(): | |
| def __init__(self, id, str): | |
| self.__dict__.update(locals()) | |
| self.list = False | |
| def __str__(self): | |
| return self.str | |
| class AstTransform: | |
| pass | |
| class AstTransformSubstitution(AstTransform): | |
| def __init__(self, idx): | |
| self.__dict__.update(locals()) | |
| def __repr__(self): | |
| return '$' + str(self.idx) | |
| def __str__(self): | |
| return self.__repr__() | |
| class AstTransformNodeCreator(AstTransform): | |
| def __init__( self, name, parameters ): | |
| self.__dict__.update(locals()) | |
| def __repr__( self ): | |
| return self.name + '( ' + ', '.join(['%s=$%s' % (k,str(v)) for k,v in self.parameters.items()]) + ' )' | |
| def __str__(self): | |
| return self.__repr__() | |
| class AstList(list): | |
| def ast(self): | |
| retval = [] | |
| for ast in self: | |
| retval.append(ast.ast()) | |
| return retval | |
| def dumps(self, indent=None, b64_source=True): | |
| args = locals() | |
| del args['self'] | |
| return ast_string(self, **args) | |
| class ParseTree(): | |
| def __init__(self, nonterminal): | |
| self.__dict__.update(locals()) | |
| self.children = [] | |
| self.astTransform = None | |
| self.isExpr = False | |
| self.isNud = False | |
| self.isPrefix = False | |
| self.isInfix = False | |
| self.nudMorphemeCount = 0 | |
| self.isExprNud = False # true for rules like _expr := {_expr} + {...} | |
| self.list_separator_id = None | |
| self.list = False | |
| def debug_str(self): | |
| from copy import deepcopy | |
| def h(v): | |
| if v == False or v is None: | |
| return str(v) | |
| from xtermcolor import colorize | |
| return colorize(str(v), ansi=190) | |
| d = deepcopy(self.__dict__) | |
| for key in ['self', 'nonterminal', 'children']: | |
| del d[key] | |
| f = {k: v for k, v in d.items() if v != False and v is not None} | |
| return ' [{}]'.format(', '.join(['{}={}'.format(k,h(v)) for k,v in f.items()])) | |
| def add(self, tree): | |
| self.children.append( tree ) | |
| def ast(self): | |
| if self.list == True: | |
| r = AstList() | |
| if len(self.children) == 0: | |
| return r | |
| for child in self.children: | |
| if isinstance(child, Terminal) and self.list_separator_id is not None and child.id == self.list_separator_id: | |
| continue | |
| r.append(child.ast()) | |
| return r | |
| elif self.isExpr: | |
| if isinstance(self.astTransform, AstTransformSubstitution): | |
| return self.children[self.astTransform.idx].ast() | |
| elif isinstance(self.astTransform, AstTransformNodeCreator): | |
| parameters = OrderedDict() | |
| for name, idx in self.astTransform.parameters.items(): | |
| if idx == '$': | |
| child = self.children[0] | |
| elif isinstance(self.children[0], ParseTree) and \ | |
| self.children[0].isNud and \ | |
| not self.children[0].isPrefix and \ | |
| not self.isExprNud and \ | |
| not self.isInfix: | |
| if idx < self.children[0].nudMorphemeCount: | |
| child = self.children[0].children[idx] | |
| else: | |
| index = idx - self.children[0].nudMorphemeCount + 1 | |
| child = self.children[index] | |
| elif len(self.children) == 1 and not isinstance(self.children[0], ParseTree) and not isinstance(self.children[0], list): | |
| return self.children[0] | |
| else: | |
| child = self.children[idx] | |
| parameters[name] = child.ast() | |
| return Ast(self.astTransform.name, parameters) | |
| else: | |
| if isinstance(self.astTransform, AstTransformSubstitution): | |
| return self.children[self.astTransform.idx].ast() | |
| elif isinstance(self.astTransform, AstTransformNodeCreator): | |
| parameters = OrderedDict() | |
| for name, idx in self.astTransform.parameters.items(): | |
| parameters[name] = self.children[idx].ast() | |
| return Ast(self.astTransform.name, parameters) | |
| elif len(self.children): | |
| return self.children[0].ast() | |
| else: | |
| return None | |
| def dumps(self, indent=None, b64_source=True, debug=False): | |
| args = locals() | |
| del args['self'] | |
| return parse_tree_string(self, **args) | |
| class Ast(): | |
| def __init__(self, name, attributes): | |
| self.__dict__.update(locals()) | |
| def attr(self, attr): | |
| return self.attributes[attr] | |
| def dumps(self, indent=None, b64_source=True): | |
| args = locals() | |
| del args['self'] | |
| return ast_string(self, **args) | |
| class SyntaxError(Exception): | |
| def __init__(self, message): | |
| self.__dict__.update(locals()) | |
| def __str__(self): | |
| return self.message | |
| class TokenStream(list): | |
| def __init__(self, arg=[]): | |
| super(TokenStream, self).__init__(arg) | |
| self.index = 0 | |
| def advance(self): | |
| self.index += 1 | |
| return self.current() | |
| def last(self): | |
| return self[-1] | |
| def current(self): | |
| try: | |
| return self[self.index] | |
| except IndexError: | |
| return None | |
| class DefaultSyntaxErrorHandler: | |
| def __init__(self): | |
| self.errors = [] | |
| def _error(self, string): | |
| error = SyntaxError(string) | |
| self.errors.append(error) | |
| return error | |
| def unexpected_eof(self): | |
| return self._error("Error: unexpected end of file") | |
| def excess_tokens(self): | |
| return self._error("Finished parsing without consuming all tokens.") | |
| def unexpected_symbol(self, nonterminal, actual_terminal, expected_terminals, rule): | |
| return self._error("Unexpected symbol (line {line}, col {col}) when parsing parse_{nt}. Expected {expected}, got {actual}.".format( | |
| line=actual_terminal.line, | |
| col=actual_terminal.col, | |
| nt=nonterminal, | |
| expected=', '.join(expected_terminals), | |
| actual=actual_terminal | |
| )) | |
| def no_more_tokens(self, nonterminal, expected_terminal, last_terminal): | |
| return self._error("No more tokens. Expecting " + expected_terminal) | |
| def invalid_terminal(self, nonterminal, invalid_terminal): | |
| return self._error("Invalid symbol ID: {} ({})".format(invalid_terminal.id, invalid_terminal.string)) | |
| def unrecognized_token(self, string, line, col): | |
| lines = string.split('\n') | |
| bad_line = lines[line-1] | |
| return self._error('Unrecognized token on line {}, column {}:\n\n{}\n{}'.format( | |
| line, col, bad_line, ''.join([' ' for x in range(col-1)]) + '^' | |
| )) | |
| def missing_list_items(self, method, required, found, last): | |
| return self._error("List for {} requires {} items but only {} were found.".format(method, required, found)) | |
| def missing_terminator(self, method, terminator, last): | |
| return self._error("List for "+method+" is missing a terminator") | |
| class ParserContext: | |
| def __init__(self, tokens, errors): | |
| self.__dict__.update(locals()) | |
| self.nonterminal_string = None | |
| self.rule_string = None | |
| # Parser Code # | |
| terminals = { | |
| 0: 'dash', | |
| 1: 'raw_cmd_end', | |
| 2: 'runtime', | |
| 3: 'integer', | |
| 4: 'raw_cmd_start', | |
| 5: 'cmd_param_start', | |
| 6: 'not_equal', | |
| 7: 'meta', | |
| 8: 'double_ampersand', | |
| 9: 'float', | |
| 10: 'while', | |
| 11: 'e', | |
| 12: 'scatter', | |
| 13: 'gteq', | |
| 14: 'call', | |
| 15: 'import', | |
| 16: 'as', | |
| 17: 'identifier', | |
| 18: 'cmd_attr_hint', | |
| 19: 'lt', | |
| 20: 'not', | |
| 21: 'colon', | |
| 22: 'fqn', | |
| 23: 'dot', | |
| 24: 'plus', | |
| 25: 'workflow', | |
| 26: 'output', | |
| 27: 'cmd_part', | |
| 28: 'if', | |
| 29: 'parameter_meta', | |
| 30: 'type_e', | |
| 31: 'lparen', | |
| 32: 'gt', | |
| 33: 'boolean', | |
| 34: 'raw_command', | |
| 35: 'slash', | |
| 36: 'percent', | |
| 37: 'lsquare', | |
| 38: 'else', | |
| 39: 'task', | |
| 40: 'lbrace', | |
| 41: 'double_pipe', | |
| 42: 'string', | |
| 43: 'rsquare', | |
| 44: 'comma', | |
| 45: 'object', | |
| 46: 'equal', | |
| 47: 'cmd_param_end', | |
| 48: 'input', | |
| 49: 'asterisk', | |
| 50: 'in', | |
| 51: 'qmark', | |
| 52: 'lteq', | |
| 53: 'then', | |
| 54: 'type', | |
| 55: 'double_equal', | |
| 56: 'rparen', | |
| 57: 'rbrace', | |
| 'dash': 0, | |
| 'raw_cmd_end': 1, | |
| 'runtime': 2, | |
| 'integer': 3, | |
| 'raw_cmd_start': 4, | |
| 'cmd_param_start': 5, | |
| 'not_equal': 6, | |
| 'meta': 7, | |
| 'double_ampersand': 8, | |
| 'float': 9, | |
| 'while': 10, | |
| 'e': 11, | |
| 'scatter': 12, | |
| 'gteq': 13, | |
| 'call': 14, | |
| 'import': 15, | |
| 'as': 16, | |
| 'identifier': 17, | |
| 'cmd_attr_hint': 18, | |
| 'lt': 19, | |
| 'not': 20, | |
| 'colon': 21, | |
| 'fqn': 22, | |
| 'dot': 23, | |
| 'plus': 24, | |
| 'workflow': 25, | |
| 'output': 26, | |
| 'cmd_part': 27, | |
| 'if': 28, | |
| 'parameter_meta': 29, | |
| 'type_e': 30, | |
| 'lparen': 31, | |
| 'gt': 32, | |
| 'boolean': 33, | |
| 'raw_command': 34, | |
| 'slash': 35, | |
| 'percent': 36, | |
| 'lsquare': 37, | |
| 'else': 38, | |
| 'task': 39, | |
| 'lbrace': 40, | |
| 'double_pipe': 41, | |
| 'string': 42, | |
| 'rsquare': 43, | |
| 'comma': 44, | |
| 'object': 45, | |
| 'equal': 46, | |
| 'cmd_param_end': 47, | |
| 'input': 48, | |
| 'asterisk': 49, | |
| 'in': 50, | |
| 'qmark': 51, | |
| 'lteq': 52, | |
| 'then': 53, | |
| 'type': 54, | |
| 'double_equal': 55, | |
| 'rparen': 56, | |
| 'rbrace': 57, | |
| } | |
| # table[nonterminal][terminal] = rule | |
| table = [ | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1, -1, 7, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, 52, -1, -1, 52, -1, 52, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, 52, 52, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, 52], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1], | |
| [-1, -1, 35, -1, -1, -1, -1, 35, -1, -1, 35, -1, 35, -1, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35, 35, -1, 35, 35, 35, -1, -1, -1, 35, -1, -1, -1, -1, 35, -1, -1, -1, -1, -1, -1, 34, -1, 35, -1, -1, -1, -1, -1, 35, -1, -1, 35], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, 48, -1, -1, 43, -1, 45, -1, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, -1, 44, 47, 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 42, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, 50, -1, -1, 50, -1, 50, -1, 50, -1, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, 50, 50, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, 50], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [38, -1, -1, 38, -1, -1, -1, -1, -1, 38, -1, 38, -1, -1, -1, -1, -1, 38, -1, -1, 38, -1, -1, -1, 38, -1, -1, -1, 38, -1, -1, 38, -1, 38, -1, -1, -1, 38, -1, -1, 38, -1, 38, -1, -1, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, 65, -1, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, -1, -1, 66], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, 15, -1, -1, -1, -1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 14, -1, -1, 16, -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], | |
| ] | |
| nonterminal_first = { | |
| 58: [25], | |
| 59: [-1, 16], | |
| 60: [26], | |
| 61: [17, -1], | |
| 62: [2, 34, 29, -1, 7, 26], | |
| 63: [40, -1], | |
| 64: [54, 30], | |
| 65: [29], | |
| 66: [17, -1], | |
| 67: [7], | |
| 68: [-1, 15], | |
| 69: [46], | |
| 70: [15], | |
| 71: [54, 22, 30], | |
| 72: [46, -1], | |
| 73: [0, 33, 3, 37, 31, 40, 9, 42, 11, 45, 17, 20, 28, -1, 24], | |
| 74: [54, -1, 30], | |
| 75: [54, 30, 25, 39], | |
| 76: [7, 26, 29, 28, 10, 12, 30, 54, 14, -1], | |
| 77: [22], | |
| 78: [27, -1, 5], | |
| 79: [18], | |
| 80: [14], | |
| 81: [23], | |
| 82: [39], | |
| 83: [17], | |
| 84: [27, 5], | |
| 85: [17, -1], | |
| 86: [34], | |
| 87: [7, 26, 28, 10, 12, 29, 30, 14, 54], | |
| 88: [5], | |
| 89: [-1, 16], | |
| 90: [54, 30], | |
| 91: [54, 30], | |
| 92: [40], | |
| 93: [22, 30, 54, -1], | |
| 94: [2], | |
| 95: [0, 17, 33, 3, 20, 37, 45, 40, 9, 28, 11, 42, 31, 24], | |
| 96: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 97: [40], | |
| 98: [25, 39, 30, 54, -1], | |
| 99: [54, 30], | |
| 100: [26], | |
| 101: [30, 54, -1, 15, 25, 39], | |
| 102: [23, -1], | |
| 103: [29], | |
| 104: [0, 33, 3, 37, 31, 40, 9, 42, 11, 45, 17, 20, 28, -1, 24], | |
| 105: [28], | |
| 106: [10], | |
| 107: [17], | |
| 108: [48, -1], | |
| 109: [54, -1, 30], | |
| 110: [29, 7, 2, 34, 26], | |
| 111: [16], | |
| 112: [48], | |
| 113: [12], | |
| 114: [7], | |
| 115: [54, -1, 30], | |
| 116: [16], | |
| 117: [17], | |
| 118: [18, -1], | |
| } | |
| nonterminal_follow = { | |
| 58: [-1, 25, 39, 30, 54], | |
| 59: [-1, 30, 54, 15, 25, 39], | |
| 60: [2, 34, 7, 26, 29, 57], | |
| 61: [57], | |
| 62: [57], | |
| 63: [7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 64: [17, 44, 43], | |
| 65: [7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 66: [48, 57], | |
| 67: [2, 34, 7, 26, 29, 57], | |
| 68: [54, -1, 30, 25, 39], | |
| 69: [2, 34, 7, 39, 10, 12, 14, -1, 48, 25, 26, 28, 30, 29, 54, 57], | |
| 70: [-1, 30, 54, 15, 25, 39], | |
| 71: [30, 22, 54, 57], | |
| 72: [2, 34, 7, 39, 10, 12, 14, -1, 48, 25, 26, 28, 30, 29, 54, 57], | |
| 73: [43, 56], | |
| 74: [43], | |
| 75: [-1, 25, 39, 30, 54], | |
| 76: [57], | |
| 77: [30, 22, 54, 57], | |
| 78: [1], | |
| 79: [0, 33, 3, 37, 40, 9, 42, 11, 45, 17, 18, 20, 28, 31, 24], | |
| 80: [7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 81: [30, 22, 54, 57], | |
| 82: [-1, 25, 39, 30, 54], | |
| 83: [48, 44, 57], | |
| 84: [1, 27, 5], | |
| 85: [57], | |
| 86: [2, 34, 7, 26, 29, 57], | |
| 87: [7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 88: [1, 27, 5], | |
| 89: [7, 26, 40, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 90: [30, 22, 54, 57], | |
| 91: [2, 34, 7, 39, 10, 12, 14, -1, 48, 25, 26, 28, 30, 29, 54, 57], | |
| 92: [2, 34, 7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 93: [57], | |
| 94: [2, 34, 7, 26, 29, 57], | |
| 95: [44, 57], | |
| 96: [0, 3, 2, 6, 7, 8, 9, 13, 11, 10, 12, 14, 17, 18, 19, -1, 20, 21, 22, 25, 26, 28, 30, 29, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 40, 57, 43, 42, 44, 45, 47, 49, 48, 52, 53, 54, 55, 56, 24], | |
| 97: [7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 98: [-1], | |
| 99: [54, 57, 30], | |
| 100: [7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 101: [-1], | |
| 102: [30, 22, 54, 57], | |
| 103: [2, 34, 7, 26, 29, 57], | |
| 104: [57], | |
| 105: [7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 106: [7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 107: [17, 57], | |
| 108: [57], | |
| 109: [2, 34, 29, 48, 7, 26], | |
| 110: [2, 34, 7, 26, 29, 57], | |
| 111: [7, 26, 40, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 112: [48, 57], | |
| 113: [7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 114: [7, 26, 28, 10, 12, 29, 30, 14, 54, 57], | |
| 115: [57], | |
| 116: [-1, 30, 54, 15, 25, 39], | |
| 117: [44, 57], | |
| 118: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| } | |
| rule_first = { | |
| 0: [15, -1], | |
| 1: [54, -1, 30, 25, 39], | |
| 2: [25, 39, -1, 30, 54, 15], | |
| 3: [25], | |
| 4: [39], | |
| 5: [54, 30], | |
| 6: [16], | |
| 7: [-1], | |
| 8: [15], | |
| 9: [16], | |
| 10: [54, -1, 30], | |
| 11: [2, 34, 7, 26, 29, -1], | |
| 12: [39], | |
| 13: [34], | |
| 14: [26], | |
| 15: [2], | |
| 16: [29], | |
| 17: [7], | |
| 18: [27, -1, 5], | |
| 19: [34], | |
| 20: [27], | |
| 21: [5], | |
| 22: [18, -1], | |
| 23: [5], | |
| 24: [18], | |
| 25: [54, -1, 30], | |
| 26: [26], | |
| 27: [54, 30], | |
| 28: [2], | |
| 29: [29], | |
| 30: [7], | |
| 31: [17, -1], | |
| 32: [40], | |
| 33: [17], | |
| 34: [46], | |
| 35: [-1], | |
| 36: [54, 30], | |
| 37: [46], | |
| 38: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 39: [7, 26, 28, 10, 12, 29, 30, 14, 54, -1], | |
| 40: [25], | |
| 41: [14], | |
| 42: [54, 30], | |
| 43: [10], | |
| 44: [28], | |
| 45: [12], | |
| 46: [26], | |
| 47: [29], | |
| 48: [7], | |
| 49: [16], | |
| 50: [-1], | |
| 51: [40], | |
| 52: [-1], | |
| 53: [14], | |
| 54: [48, -1], | |
| 55: [40], | |
| 56: [17, -1], | |
| 57: [48], | |
| 58: [17], | |
| 59: [16], | |
| 60: [54, -1, 22, 30], | |
| 61: [26], | |
| 62: [54, 30], | |
| 63: [22], | |
| 64: [54, 30], | |
| 65: [23], | |
| 66: [-1], | |
| 67: [22], | |
| 68: [23], | |
| 69: [29], | |
| 70: [7], | |
| 71: [10], | |
| 72: [28], | |
| 73: [12], | |
| 74: [17], | |
| 75: [54, -1, 30], | |
| 76: [54], | |
| 77: [54], | |
| 78: [54], | |
| 79: [54], | |
| 80: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 81: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 82: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 83: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 84: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 85: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 86: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 87: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 88: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 89: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 90: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 91: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 92: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, 31, 45], | |
| 93: [20], | |
| 94: [24], | |
| 95: [0], | |
| 96: [0, 17, 33, 3, 20, 24, 37, 40, 9, 28, 11, 42, -1, 31, 45], | |
| 97: [17], | |
| 98: [17], | |
| 99: [17], | |
| 100: [17, -1], | |
| 101: [45], | |
| 102: [37], | |
| 103: [0, 17, 33, 3, 20, 37, 45, 40, 9, 28, 11, 42, -1, 31, 24], | |
| 104: [40], | |
| 105: [31], | |
| 106: [28], | |
| 107: [42], | |
| 108: [17], | |
| 109: [33], | |
| 110: [3], | |
| 111: [9], | |
| } | |
| nonterminal_rules = { | |
| 58: [ | |
| "$workflow = :workflow :identifier :lbrace $_gen10 :rbrace -> Workflow( name=$1, body=$3 )", | |
| ], | |
| 59: [ | |
| "$_gen2 = $import_namespace", | |
| "$_gen2 = :_empty", | |
| ], | |
| 60: [ | |
| "$outputs = :output :lbrace $_gen7 :rbrace -> Outputs( attributes=$2 )", | |
| ], | |
| 61: [ | |
| "$_gen8 = list($kv)", | |
| ], | |
| 62: [ | |
| "$_gen4 = list($sections)", | |
| ], | |
| 63: [ | |
| "$_gen12 = $call_body", | |
| "$_gen12 = :_empty", | |
| ], | |
| 64: [ | |
| "$type_e = :type <=> :lsquare $_gen17 :rsquare -> Type( name=$0, subtype=$2 )", | |
| "$type_e = :type <=> :qmark -> OptionalType( innerType=$0 )", | |
| "$type_e = :type <=> :plus -> NonEmptyType( innerType=$0 )", | |
| "$type_e = :type", | |
| ], | |
| 65: [ | |
| "$wf_parameter_meta = :parameter_meta $map -> ParameterMeta( map=$1 )", | |
| ], | |
| 66: [ | |
| "$_gen14 = list($mapping, :comma)", | |
| ], | |
| 67: [ | |
| "$meta = :meta $map -> Meta( map=$1 )", | |
| ], | |
| 68: [ | |
| "$_gen0 = list($import)", | |
| ], | |
| 69: [ | |
| "$setter = :equal $e -> $1", | |
| ], | |
| 70: [ | |
| "$import = :import :string $_gen2 -> Import( uri=$1, namespace=$2 )", | |
| ], | |
| 71: [ | |
| "$wf_output = $wf_output_declaration_syntax", | |
| "$wf_output = $wf_output_wildcard_syntax", | |
| ], | |
| 72: [ | |
| "$_gen9 = $setter", | |
| "$_gen9 = :_empty", | |
| ], | |
| 73: [ | |
| "$_gen18 = list($e, :comma)", | |
| ], | |
| 74: [ | |
| "$_gen17 = list($type_e, :comma)", | |
| ], | |
| 75: [ | |
| "$workflow_or_task_or_decl = $workflow", | |
| "$workflow_or_task_or_decl = $task", | |
| "$workflow_or_task_or_decl = $declaration", | |
| ], | |
| 76: [ | |
| "$_gen10 = list($wf_body_element)", | |
| ], | |
| 77: [ | |
| "$wf_output_wildcard_syntax = :fqn $_gen16 -> WorkflowOutputWildcard( fqn=$0, wildcard=$1 )", | |
| ], | |
| 78: [ | |
| "$_gen5 = list($command_part)", | |
| ], | |
| 79: [ | |
| "$cmd_param_kv = :cmd_attr_hint :identifier :equal $e -> CommandParameterAttr( key=$1, value=$3 )", | |
| ], | |
| 80: [ | |
| "$call = :call :fqn $_gen11 $_gen12 -> Call( task=$1, alias=$2, body=$3 )", | |
| ], | |
| 81: [ | |
| "$wf_output_wildcard = :dot :asterisk -> $1", | |
| ], | |
| 82: [ | |
| "$task = :task :identifier :lbrace $_gen3 $_gen4 :rbrace -> Task( name=$1, declarations=$3, sections=$4 )", | |
| ], | |
| 83: [ | |
| "$mapping = :identifier :equal $e -> IOMapping( key=$0, value=$2 )", | |
| ], | |
| 84: [ | |
| "$command_part = :cmd_part", | |
| "$command_part = $cmd_param", | |
| ], | |
| 85: [ | |
| "$_gen19 = list($object_kv, :comma)", | |
| ], | |
| 86: [ | |
| "$command = :raw_command :raw_cmd_start $_gen5 :raw_cmd_end -> RawCommand( parts=$2 )", | |
| ], | |
| 87: [ | |
| "$wf_body_element = $call", | |
| "$wf_body_element = $declaration", | |
| "$wf_body_element = $while_loop", | |
| "$wf_body_element = $if_stmt", | |
| "$wf_body_element = $scatter", | |
| "$wf_body_element = $wf_outputs", | |
| "$wf_body_element = $wf_parameter_meta", | |
| "$wf_body_element = $wf_meta", | |
| ], | |
| 88: [ | |
| "$cmd_param = :cmd_param_start $_gen6 $e :cmd_param_end -> CommandParameter( attributes=$1, expr=$2 )", | |
| ], | |
| 89: [ | |
| "$_gen11 = $alias", | |
| "$_gen11 = :_empty", | |
| ], | |
| 90: [ | |
| "$wf_output_declaration_syntax = $type_e :identifier :equal $e -> WorkflowOutputDeclaration( type=$0, name=$1, expression=$3 )", | |
| ], | |
| 91: [ | |
| "$declaration = $type_e :identifier $_gen9 -> Declaration( type=$0, name=$1, expression=$2 )", | |
| ], | |
| 92: [ | |
| "$map = :lbrace $_gen8 :rbrace -> $1", | |
| ], | |
| 93: [ | |
| "$_gen15 = list($wf_output)", | |
| ], | |
| 94: [ | |
| "$runtime = :runtime $map -> Runtime( map=$1 )", | |
| ], | |
| 95: [ | |
| "$map_kv = $e :colon $e -> MapLiteralKv( key=$0, value=$2 )", | |
| ], | |
| 96: [ | |
| "$e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 )", | |
| "$e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 )", | |
| "$e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 )", | |
| "$e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 )", | |
| "$e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 )", | |
| "$e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 )", | |
| "$e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 )", | |
| "$e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 )", | |
| "$e = $e :plus $e -> Add( lhs=$0, rhs=$2 )", | |
| "$e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 )", | |
| "$e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 )", | |
| "$e = $e :slash $e -> Divide( lhs=$0, rhs=$2 )", | |
| "$e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 )", | |
| "$e = :not $e -> LogicalNot( expression=$1 )", | |
| "$e = :plus $e -> UnaryPlus( expression=$1 )", | |
| "$e = :dash $e -> UnaryNegation( expression=$1 )", | |
| "$e = :identifier <=> :lparen $_gen18 :rparen -> FunctionCall( name=$0, params=$2 )", | |
| "$e = :identifier <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 )", | |
| "$e = :identifier <=> :dot :identifier -> MemberAccess( lhs=$0, rhs=$2 )", | |
| "$e = :object :lbrace $_gen19 :rbrace -> ObjectLiteral( map=$2 )", | |
| "$e = :lsquare $_gen18 :rsquare -> ArrayLiteral( values=$1 )", | |
| "$e = :lbrace $_gen20 :rbrace -> MapLiteral( map=$1 )", | |
| "$e = :lparen $_gen18 :rparen -> TupleLiteral( values=$1 )", | |
| "$e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 )", | |
| "$e = :string", | |
| "$e = :identifier", | |
| "$e = :boolean", | |
| "$e = :integer", | |
| "$e = :float", | |
| ], | |
| 97: [ | |
| "$call_body = :lbrace $_gen3 $_gen13 :rbrace -> CallBody( declarations=$1, io=$2 )", | |
| ], | |
| 98: [ | |
| "$_gen1 = list($workflow_or_task_or_decl)", | |
| ], | |
| 99: [ | |
| "$output_kv = $type_e :identifier :equal $e -> Output( type=$0, name=$1, expression=$3 )", | |
| ], | |
| 100: [ | |
| "$wf_outputs = :output :lbrace $_gen15 :rbrace -> WorkflowOutputs( outputs=$2 )", | |
| ], | |
| 101: [ | |
| "$document = $_gen0 $_gen1 -> Namespace( imports=$0, body=$1 )", | |
| ], | |
| 102: [ | |
| "$_gen16 = $wf_output_wildcard", | |
| "$_gen16 = :_empty", | |
| ], | |
| 103: [ | |
| "$parameter_meta = :parameter_meta $map -> ParameterMeta( map=$1 )", | |
| ], | |
| 104: [ | |
| "$_gen20 = list($map_kv, :comma)", | |
| ], | |
| 105: [ | |
| "$if_stmt = :if :lparen $e :rparen :lbrace $_gen10 :rbrace -> If( expression=$2, body=$5 )", | |
| ], | |
| 106: [ | |
| "$while_loop = :while :lparen $e :rparen :lbrace $_gen10 :rbrace -> WhileLoop( expression=$2, body=$5 )", | |
| ], | |
| 107: [ | |
| "$kv = :identifier :colon $e -> RuntimeAttribute( key=$0, value=$2 )", | |
| ], | |
| 108: [ | |
| "$_gen13 = list($call_input)", | |
| ], | |
| 109: [ | |
| "$_gen3 = list($declaration)", | |
| ], | |
| 110: [ | |
| "$sections = $command", | |
| "$sections = $outputs", | |
| "$sections = $runtime", | |
| "$sections = $parameter_meta", | |
| "$sections = $meta", | |
| ], | |
| 111: [ | |
| "$alias = :as :identifier -> $1", | |
| ], | |
| 112: [ | |
| "$call_input = :input :colon $_gen14 -> Inputs( map=$2 )", | |
| ], | |
| 113: [ | |
| "$scatter = :scatter :lparen :identifier :in $e :rparen :lbrace $_gen10 :rbrace -> Scatter( item=$2, collection=$4, body=$7 )", | |
| ], | |
| 114: [ | |
| "$wf_meta = :meta $map -> Meta( map=$1 )", | |
| ], | |
| 115: [ | |
| "$_gen7 = list($output_kv)", | |
| ], | |
| 116: [ | |
| "$import_namespace = :as :identifier -> $1", | |
| ], | |
| 117: [ | |
| "$object_kv = :identifier :colon $e -> ObjectKV( key=$0, value=$2 )", | |
| ], | |
| 118: [ | |
| "$_gen6 = list($cmd_param_kv)", | |
| ], | |
| } | |
| rules = { | |
| 0: "$_gen0 = list($import)", | |
| 1: "$_gen1 = list($workflow_or_task_or_decl)", | |
| 2: "$document = $_gen0 $_gen1 -> Namespace( imports=$0, body=$1 )", | |
| 3: "$workflow_or_task_or_decl = $workflow", | |
| 4: "$workflow_or_task_or_decl = $task", | |
| 5: "$workflow_or_task_or_decl = $declaration", | |
| 6: "$_gen2 = $import_namespace", | |
| 7: "$_gen2 = :_empty", | |
| 8: "$import = :import :string $_gen2 -> Import( uri=$1, namespace=$2 )", | |
| 9: "$import_namespace = :as :identifier -> $1", | |
| 10: "$_gen3 = list($declaration)", | |
| 11: "$_gen4 = list($sections)", | |
| 12: "$task = :task :identifier :lbrace $_gen3 $_gen4 :rbrace -> Task( name=$1, declarations=$3, sections=$4 )", | |
| 13: "$sections = $command", | |
| 14: "$sections = $outputs", | |
| 15: "$sections = $runtime", | |
| 16: "$sections = $parameter_meta", | |
| 17: "$sections = $meta", | |
| 18: "$_gen5 = list($command_part)", | |
| 19: "$command = :raw_command :raw_cmd_start $_gen5 :raw_cmd_end -> RawCommand( parts=$2 )", | |
| 20: "$command_part = :cmd_part", | |
| 21: "$command_part = $cmd_param", | |
| 22: "$_gen6 = list($cmd_param_kv)", | |
| 23: "$cmd_param = :cmd_param_start $_gen6 $e :cmd_param_end -> CommandParameter( attributes=$1, expr=$2 )", | |
| 24: "$cmd_param_kv = :cmd_attr_hint :identifier :equal $e -> CommandParameterAttr( key=$1, value=$3 )", | |
| 25: "$_gen7 = list($output_kv)", | |
| 26: "$outputs = :output :lbrace $_gen7 :rbrace -> Outputs( attributes=$2 )", | |
| 27: "$output_kv = $type_e :identifier :equal $e -> Output( type=$0, name=$1, expression=$3 )", | |
| 28: "$runtime = :runtime $map -> Runtime( map=$1 )", | |
| 29: "$parameter_meta = :parameter_meta $map -> ParameterMeta( map=$1 )", | |
| 30: "$meta = :meta $map -> Meta( map=$1 )", | |
| 31: "$_gen8 = list($kv)", | |
| 32: "$map = :lbrace $_gen8 :rbrace -> $1", | |
| 33: "$kv = :identifier :colon $e -> RuntimeAttribute( key=$0, value=$2 )", | |
| 34: "$_gen9 = $setter", | |
| 35: "$_gen9 = :_empty", | |
| 36: "$declaration = $type_e :identifier $_gen9 -> Declaration( type=$0, name=$1, expression=$2 )", | |
| 37: "$setter = :equal $e -> $1", | |
| 38: "$map_kv = $e :colon $e -> MapLiteralKv( key=$0, value=$2 )", | |
| 39: "$_gen10 = list($wf_body_element)", | |
| 40: "$workflow = :workflow :identifier :lbrace $_gen10 :rbrace -> Workflow( name=$1, body=$3 )", | |
| 41: "$wf_body_element = $call", | |
| 42: "$wf_body_element = $declaration", | |
| 43: "$wf_body_element = $while_loop", | |
| 44: "$wf_body_element = $if_stmt", | |
| 45: "$wf_body_element = $scatter", | |
| 46: "$wf_body_element = $wf_outputs", | |
| 47: "$wf_body_element = $wf_parameter_meta", | |
| 48: "$wf_body_element = $wf_meta", | |
| 49: "$_gen11 = $alias", | |
| 50: "$_gen11 = :_empty", | |
| 51: "$_gen12 = $call_body", | |
| 52: "$_gen12 = :_empty", | |
| 53: "$call = :call :fqn $_gen11 $_gen12 -> Call( task=$1, alias=$2, body=$3 )", | |
| 54: "$_gen13 = list($call_input)", | |
| 55: "$call_body = :lbrace $_gen3 $_gen13 :rbrace -> CallBody( declarations=$1, io=$2 )", | |
| 56: "$_gen14 = list($mapping, :comma)", | |
| 57: "$call_input = :input :colon $_gen14 -> Inputs( map=$2 )", | |
| 58: "$mapping = :identifier :equal $e -> IOMapping( key=$0, value=$2 )", | |
| 59: "$alias = :as :identifier -> $1", | |
| 60: "$_gen15 = list($wf_output)", | |
| 61: "$wf_outputs = :output :lbrace $_gen15 :rbrace -> WorkflowOutputs( outputs=$2 )", | |
| 62: "$wf_output = $wf_output_declaration_syntax", | |
| 63: "$wf_output = $wf_output_wildcard_syntax", | |
| 64: "$wf_output_declaration_syntax = $type_e :identifier :equal $e -> WorkflowOutputDeclaration( type=$0, name=$1, expression=$3 )", | |
| 65: "$_gen16 = $wf_output_wildcard", | |
| 66: "$_gen16 = :_empty", | |
| 67: "$wf_output_wildcard_syntax = :fqn $_gen16 -> WorkflowOutputWildcard( fqn=$0, wildcard=$1 )", | |
| 68: "$wf_output_wildcard = :dot :asterisk -> $1", | |
| 69: "$wf_parameter_meta = :parameter_meta $map -> ParameterMeta( map=$1 )", | |
| 70: "$wf_meta = :meta $map -> Meta( map=$1 )", | |
| 71: "$while_loop = :while :lparen $e :rparen :lbrace $_gen10 :rbrace -> WhileLoop( expression=$2, body=$5 )", | |
| 72: "$if_stmt = :if :lparen $e :rparen :lbrace $_gen10 :rbrace -> If( expression=$2, body=$5 )", | |
| 73: "$scatter = :scatter :lparen :identifier :in $e :rparen :lbrace $_gen10 :rbrace -> Scatter( item=$2, collection=$4, body=$7 )", | |
| 74: "$object_kv = :identifier :colon $e -> ObjectKV( key=$0, value=$2 )", | |
| 75: "$_gen17 = list($type_e, :comma)", | |
| 76: "$type_e = :type <=> :lsquare $_gen17 :rsquare -> Type( name=$0, subtype=$2 )", | |
| 77: "$type_e = :type <=> :qmark -> OptionalType( innerType=$0 )", | |
| 78: "$type_e = :type <=> :plus -> NonEmptyType( innerType=$0 )", | |
| 79: "$type_e = :type", | |
| 80: "$e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 )", | |
| 81: "$e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 )", | |
| 82: "$e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 )", | |
| 83: "$e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 )", | |
| 84: "$e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 )", | |
| 85: "$e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 )", | |
| 86: "$e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 )", | |
| 87: "$e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 )", | |
| 88: "$e = $e :plus $e -> Add( lhs=$0, rhs=$2 )", | |
| 89: "$e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 )", | |
| 90: "$e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 )", | |
| 91: "$e = $e :slash $e -> Divide( lhs=$0, rhs=$2 )", | |
| 92: "$e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 )", | |
| 93: "$e = :not $e -> LogicalNot( expression=$1 )", | |
| 94: "$e = :plus $e -> UnaryPlus( expression=$1 )", | |
| 95: "$e = :dash $e -> UnaryNegation( expression=$1 )", | |
| 96: "$_gen18 = list($e, :comma)", | |
| 97: "$e = :identifier <=> :lparen $_gen18 :rparen -> FunctionCall( name=$0, params=$2 )", | |
| 98: "$e = :identifier <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 )", | |
| 99: "$e = :identifier <=> :dot :identifier -> MemberAccess( lhs=$0, rhs=$2 )", | |
| 100: "$_gen19 = list($object_kv, :comma)", | |
| 101: "$e = :object :lbrace $_gen19 :rbrace -> ObjectLiteral( map=$2 )", | |
| 102: "$e = :lsquare $_gen18 :rsquare -> ArrayLiteral( values=$1 )", | |
| 103: "$_gen20 = list($map_kv, :comma)", | |
| 104: "$e = :lbrace $_gen20 :rbrace -> MapLiteral( map=$1 )", | |
| 105: "$e = :lparen $_gen18 :rparen -> TupleLiteral( values=$1 )", | |
| 106: "$e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 )", | |
| 107: "$e = :string", | |
| 108: "$e = :identifier", | |
| 109: "$e = :boolean", | |
| 110: "$e = :integer", | |
| 111: "$e = :float", | |
| } | |
| def is_terminal(id): return isinstance(id, int) and 0 <= id <= 57 | |
| def parse(tokens, errors=None, start=None): | |
| if errors is None: | |
| errors = DefaultSyntaxErrorHandler() | |
| if isinstance(tokens, str): | |
| tokens = lex(tokens, 'string', errors) | |
| ctx = ParserContext(tokens, errors) | |
| tree = parse_document(ctx) | |
| if tokens.current() != None: | |
| raise ctx.errors.excess_tokens() | |
| return tree | |
| def expect(ctx, terminal_id): | |
| current = ctx.tokens.current() | |
| if not current: | |
| raise ctx.errors.no_more_tokens(ctx.nonterminal, terminals[terminal_id], ctx.tokens.last()) | |
| if current.id != terminal_id: | |
| raise ctx.errors.unexpected_symbol(ctx.nonterminal, current, [terminals[terminal_id]], ctx.rule) | |
| next = ctx.tokens.advance() | |
| if next and not is_terminal(next.id): | |
| raise ctx.errors.invalid_terminal(ctx.nonterminal, next) | |
| return current | |
| # START definitions for expression parser: e | |
| infix_binding_power_e = { | |
| 41: 4000, # $e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 ) | |
| 8: 5000, # $e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 ) | |
| 55: 6000, # $e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 ) | |
| 6: 6000, # $e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 ) | |
| 19: 7000, # $e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 ) | |
| 52: 7000, # $e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 ) | |
| 32: 7000, # $e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 ) | |
| 13: 7000, # $e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 ) | |
| 24: 8000, # $e = $e :plus $e -> Add( lhs=$0, rhs=$2 ) | |
| 0: 8000, # $e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 ) | |
| 49: 9000, # $e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 ) | |
| 35: 9000, # $e = $e :slash $e -> Divide( lhs=$0, rhs=$2 ) | |
| 36: 9000, # $e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 ) | |
| 31: 11000, # $e = :identifier <=> :lparen list($e, :comma) :rparen -> FunctionCall( name=$0, params=$2 ) | |
| 37: 12000, # $e = :identifier <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 ) | |
| 23: 13000, # $e = :identifier <=> :dot :identifier -> MemberAccess( lhs=$0, rhs=$2 ) | |
| } | |
| prefix_binding_power_e = { | |
| 20: 10000, # $e = :not $e -> LogicalNot( expression=$1 ) | |
| 24: 10000, # $e = :plus $e -> UnaryPlus( expression=$1 ) | |
| 0: 10000, # $e = :dash $e -> UnaryNegation( expression=$1 ) | |
| } | |
| def get_infix_binding_power_e(terminal_id): | |
| try: | |
| return infix_binding_power_e[terminal_id] | |
| except: | |
| return 0 | |
| def get_prefix_binding_power_e(terminal_id): | |
| try: | |
| return prefix_binding_power_e[terminal_id] | |
| except: | |
| return 0 | |
| def parse_e(ctx): | |
| return parse_e_internal(ctx, rbp=0) | |
| def parse_e_internal(ctx, rbp=0): | |
| left = nud_e(ctx) | |
| if isinstance(left, ParseTree): | |
| left.isExpr = True | |
| left.isNud = True | |
| while ctx.tokens.current() and rbp < get_infix_binding_power_e(ctx.tokens.current().id): | |
| left = led_e(left, ctx) | |
| if left: | |
| left.isExpr = True | |
| return left | |
| def nud_e(ctx): | |
| tree = ParseTree(NonTerminal(96, 'e')) | |
| current = ctx.tokens.current() | |
| ctx.nonterminal = "e" | |
| if not current: | |
| return tree | |
| elif current.id in rule_first[93]: | |
| # rule first == not | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :not $e -> LogicalNot( expression=$1 ) | |
| ctx.rule = rules[93] | |
| ast_parameters = OrderedDict([ | |
| ('expression', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('LogicalNot', ast_parameters) | |
| tree.nudMorphemeCount = 2 | |
| tree.add(expect(ctx, 20)) | |
| tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(20))) | |
| tree.isPrefix = True | |
| elif current.id in rule_first[94]: | |
| # rule first == plus | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :plus $e -> UnaryPlus( expression=$1 ) | |
| ctx.rule = rules[94] | |
| ast_parameters = OrderedDict([ | |
| ('expression', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('UnaryPlus', ast_parameters) | |
| tree.nudMorphemeCount = 2 | |
| tree.add(expect(ctx, 24)) | |
| tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(24))) | |
| tree.isPrefix = True | |
| elif current.id in rule_first[95]: | |
| # rule first == dash | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :dash $e -> UnaryNegation( expression=$1 ) | |
| ctx.rule = rules[95] | |
| ast_parameters = OrderedDict([ | |
| ('expression', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('UnaryNegation', ast_parameters) | |
| tree.nudMorphemeCount = 2 | |
| tree.add(expect(ctx, 0)) | |
| tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(0))) | |
| tree.isPrefix = True | |
| elif current.id in rule_first[97]: | |
| # rule first == identifier | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :identifier <=> :lparen $_gen18 :rparen -> FunctionCall( name=$0, params=$2 ) | |
| ctx.rule = rules[97] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 17)) | |
| elif current.id in rule_first[98]: | |
| # rule first == identifier | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :identifier <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[98] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 17)) | |
| elif current.id in rule_first[99]: | |
| # rule first == identifier | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :identifier <=> :dot :identifier -> MemberAccess( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[99] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 17)) | |
| elif current.id in rule_first[101]: | |
| # rule first == object | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :object :lbrace $_gen19 :rbrace -> ObjectLiteral( map=$2 ) | |
| ctx.rule = rules[101] | |
| ast_parameters = OrderedDict([ | |
| ('map', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('ObjectLiteral', ast_parameters) | |
| tree.nudMorphemeCount = 4 | |
| tree.add(expect(ctx, 45)) | |
| tree.add(expect(ctx, 40)) | |
| tree.add(parse__gen19(ctx)) | |
| tree.add(expect(ctx, 57)) | |
| elif current.id in rule_first[102]: | |
| # rule first == lsquare | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :lsquare $_gen18 :rsquare -> ArrayLiteral( values=$1 ) | |
| ctx.rule = rules[102] | |
| ast_parameters = OrderedDict([ | |
| ('values', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('ArrayLiteral', ast_parameters) | |
| tree.nudMorphemeCount = 3 | |
| tree.add(expect(ctx, 37)) | |
| tree.add(parse__gen18(ctx)) | |
| tree.add(expect(ctx, 43)) | |
| elif current.id in rule_first[104]: | |
| # rule first == lbrace | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :lbrace $_gen20 :rbrace -> MapLiteral( map=$1 ) | |
| ctx.rule = rules[104] | |
| ast_parameters = OrderedDict([ | |
| ('map', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('MapLiteral', ast_parameters) | |
| tree.nudMorphemeCount = 3 | |
| tree.add(expect(ctx, 40)) | |
| tree.add(parse__gen20(ctx)) | |
| tree.add(expect(ctx, 57)) | |
| elif current.id in rule_first[105]: | |
| # rule first == lparen | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :lparen $_gen18 :rparen -> TupleLiteral( values=$1 ) | |
| ctx.rule = rules[105] | |
| ast_parameters = OrderedDict([ | |
| ('values', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('TupleLiteral', ast_parameters) | |
| tree.nudMorphemeCount = 3 | |
| tree.add(expect(ctx, 31)) | |
| tree.add(parse__gen18(ctx)) | |
| tree.add(expect(ctx, 56)) | |
| elif current.id in rule_first[106]: | |
| # rule first == if | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 ) | |
| ctx.rule = rules[106] | |
| ast_parameters = OrderedDict([ | |
| ('cond', 1), | |
| ('iftrue', 3), | |
| ('iffalse', 5), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('TernaryIf', ast_parameters) | |
| tree.nudMorphemeCount = 6 | |
| tree.add(expect(ctx, 28)) | |
| tree.add(parse_e(ctx)) | |
| tree.add(expect(ctx, 53)) | |
| tree.add(parse_e(ctx)) | |
| tree.add(expect(ctx, 38)) | |
| tree.add(parse_e(ctx)) | |
| elif current.id in rule_first[107]: | |
| # rule first == string | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :string | |
| ctx.rule = rules[107] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 42)) | |
| elif current.id in rule_first[108]: | |
| # rule first == identifier | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :identifier | |
| ctx.rule = rules[108] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 17)) | |
| elif current.id in rule_first[109]: | |
| # rule first == boolean | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :boolean | |
| ctx.rule = rules[109] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 33)) | |
| elif current.id in rule_first[110]: | |
| # rule first == integer | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :integer | |
| ctx.rule = rules[110] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 3)) | |
| elif current.id in rule_first[111]: | |
| # rule first == float | |
| # e first == dash, identifier, boolean, integer, not, plus, lsquare, lbrace, float, if, e, string, lparen, object | |
| # $e = :float | |
| ctx.rule = rules[111] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 9)) | |
| return tree | |
| def led_e(left, ctx): | |
| tree = ParseTree(NonTerminal(96, 'e')) | |
| current = ctx.tokens.current() | |
| ctx.nonterminal = "e" | |
| if current.id == 41: # :double_pipe | |
| # $e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[80] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('LogicalOr', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 41)) # :double_pipe | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(41) - modifier)) | |
| if current.id == 8: # :double_ampersand | |
| # $e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[81] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('LogicalAnd', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 8)) # :double_ampersand | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(8) - modifier)) | |
| if current.id == 55: # :double_equal | |
| # $e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[82] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Equals', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 55)) # :double_equal | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(55) - modifier)) | |
| if current.id == 6: # :not_equal | |
| # $e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[83] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('NotEquals', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 6)) # :not_equal | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(6) - modifier)) | |
| if current.id == 19: # :lt | |
| # $e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[84] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('LessThan', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 19)) # :lt | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(19) - modifier)) | |
| if current.id == 52: # :lteq | |
| # $e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[85] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('LessThanOrEqual', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 52)) # :lteq | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(52) - modifier)) | |
| if current.id == 32: # :gt | |
| # $e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[86] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('GreaterThan', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 32)) # :gt | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(32) - modifier)) | |
| if current.id == 13: # :gteq | |
| # $e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[87] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('GreaterThanOrEqual', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 13)) # :gteq | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(13) - modifier)) | |
| if current.id == 24: # :plus | |
| # $e = $e :plus $e -> Add( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[88] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Add', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 24)) # :plus | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(24) - modifier)) | |
| if current.id == 0: # :dash | |
| # $e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[89] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Subtract', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 0)) # :dash | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(0) - modifier)) | |
| if current.id == 49: # :asterisk | |
| # $e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[90] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Multiply', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 49)) # :asterisk | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(49) - modifier)) | |
| if current.id == 35: # :slash | |
| # $e = $e :slash $e -> Divide( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[91] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Divide', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 35)) # :slash | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(35) - modifier)) | |
| if current.id == 36: # :percent | |
| # $e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[92] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Remainder', ast_parameters) | |
| tree.isExprNud = True | |
| tree.add(left) | |
| tree.add(expect(ctx, 36)) # :percent | |
| modifier = 0 | |
| tree.isInfix = True | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(36) - modifier)) | |
| if current.id == 31: # :lparen | |
| # $e = :identifier <=> :lparen $_gen18 :rparen -> FunctionCall( name=$0, params=$2 ) | |
| ctx.rule = rules[97] | |
| ast_parameters = OrderedDict([ | |
| ('name', 0), | |
| ('params', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('FunctionCall', ast_parameters) | |
| tree.add(left) | |
| tree.add(expect(ctx, 31)) # :lparen | |
| tree.add(parse__gen18(ctx)) | |
| tree.add(expect(ctx, 56)) # :rparen | |
| if current.id == 37: # :lsquare | |
| # $e = :identifier <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[98] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('ArrayOrMapLookup', ast_parameters) | |
| tree.add(left) | |
| tree.add(expect(ctx, 37)) # :lsquare | |
| modifier = 0 | |
| tree.add(parse_e_internal(ctx, get_infix_binding_power_e(37) - modifier)) | |
| tree.add(expect(ctx, 43)) # :rsquare | |
| if current.id == 23: # :dot | |
| # $e = :identifier <=> :dot :identifier -> MemberAccess( lhs=$0, rhs=$2 ) | |
| ctx.rule = rules[99] | |
| ast_parameters = OrderedDict([ | |
| ('lhs', 0), | |
| ('rhs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('MemberAccess', ast_parameters) | |
| tree.add(left) | |
| tree.add(expect(ctx, 23)) # :dot | |
| tree.add(expect(ctx, 17)) # :identifier | |
| return tree | |
| # END definitions for expression parser: e | |
| # START definitions for expression parser: type_e | |
| infix_binding_power_type_e = { | |
| 37: 1000, # $type_e = :type <=> :lsquare list($type_e, :comma) :rsquare -> Type( name=$0, subtype=$2 ) | |
| 51: 2000, # $type_e = :type <=> :qmark -> OptionalType( innerType=$0 ) | |
| 24: 3000, # $type_e = :type <=> :plus -> NonEmptyType( innerType=$0 ) | |
| } | |
| prefix_binding_power_type_e = { | |
| } | |
| def get_infix_binding_power_type_e(terminal_id): | |
| try: | |
| return infix_binding_power_type_e[terminal_id] | |
| except: | |
| return 0 | |
| def get_prefix_binding_power_type_e(terminal_id): | |
| try: | |
| return prefix_binding_power_type_e[terminal_id] | |
| except: | |
| return 0 | |
| def parse_type_e(ctx): | |
| return parse_type_e_internal(ctx, rbp=0) | |
| def parse_type_e_internal(ctx, rbp=0): | |
| left = nud_type_e(ctx) | |
| if isinstance(left, ParseTree): | |
| left.isExpr = True | |
| left.isNud = True | |
| while ctx.tokens.current() and rbp < get_infix_binding_power_type_e(ctx.tokens.current().id): | |
| left = led_type_e(left, ctx) | |
| if left: | |
| left.isExpr = True | |
| return left | |
| def nud_type_e(ctx): | |
| tree = ParseTree(NonTerminal(64, 'type_e')) | |
| current = ctx.tokens.current() | |
| ctx.nonterminal = "type_e" | |
| if not current: | |
| return tree | |
| if current.id in rule_first[76]: | |
| # rule first == type | |
| # e first == type, type_e | |
| # $type_e = :type <=> :lsquare $_gen17 :rsquare -> Type( name=$0, subtype=$2 ) | |
| ctx.rule = rules[76] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 54)) | |
| elif current.id in rule_first[77]: | |
| # rule first == type | |
| # e first == type, type_e | |
| # $type_e = :type <=> :qmark -> OptionalType( innerType=$0 ) | |
| ctx.rule = rules[77] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 54)) | |
| elif current.id in rule_first[78]: | |
| # rule first == type | |
| # e first == type, type_e | |
| # $type_e = :type <=> :plus -> NonEmptyType( innerType=$0 ) | |
| ctx.rule = rules[78] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 54)) | |
| elif current.id in rule_first[79]: | |
| # rule first == type | |
| # e first == type, type_e | |
| # $type_e = :type | |
| ctx.rule = rules[79] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| tree.nudMorphemeCount = 1 | |
| tree.add(expect(ctx, 54)) | |
| return tree | |
| def led_type_e(left, ctx): | |
| tree = ParseTree(NonTerminal(64, 'type_e')) | |
| current = ctx.tokens.current() | |
| ctx.nonterminal = "type_e" | |
| if current.id == 37: # :lsquare | |
| # $type_e = :type <=> :lsquare $_gen17 :rsquare -> Type( name=$0, subtype=$2 ) | |
| ctx.rule = rules[76] | |
| ast_parameters = OrderedDict([ | |
| ('name', 0), | |
| ('subtype', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Type', ast_parameters) | |
| tree.add(left) | |
| tree.add(expect(ctx, 37)) # :lsquare | |
| tree.add(parse__gen17(ctx)) | |
| tree.add(expect(ctx, 43)) # :rsquare | |
| if current.id == 51: # :qmark | |
| # $type_e = :type <=> :qmark -> OptionalType( innerType=$0 ) | |
| ctx.rule = rules[77] | |
| ast_parameters = OrderedDict([ | |
| ('innerType', 0), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('OptionalType', ast_parameters) | |
| tree.add(left) | |
| tree.add(expect(ctx, 51)) # :qmark | |
| if current.id == 24: # :plus | |
| # $type_e = :type <=> :plus -> NonEmptyType( innerType=$0 ) | |
| ctx.rule = rules[78] | |
| ast_parameters = OrderedDict([ | |
| ('innerType', 0), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('NonEmptyType', ast_parameters) | |
| tree.add(left) | |
| tree.add(expect(ctx, 24)) # :plus | |
| return tree | |
| # END definitions for expression parser: type_e | |
| def parse__gen0(ctx): | |
| tree = ParseTree(NonTerminal(68, '_gen0')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen0" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[68]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(68)): | |
| tree.add(parse_import(ctx)) | |
| ctx.nonterminal = "_gen0" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen1(ctx): | |
| tree = ParseTree(NonTerminal(98, '_gen1')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen1" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[98]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(98)): | |
| tree.add(parse_workflow_or_task_or_decl(ctx)) | |
| ctx.nonterminal = "_gen1" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen10(ctx): | |
| tree = ParseTree(NonTerminal(76, '_gen10')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen10" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[76]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(76)): | |
| tree.add(parse_wf_body_element(ctx)) | |
| ctx.nonterminal = "_gen10" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen13(ctx): | |
| tree = ParseTree(NonTerminal(108, '_gen13')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen13" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[108]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(108)): | |
| tree.add(parse_call_input(ctx)) | |
| ctx.nonterminal = "_gen13" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen14(ctx): | |
| tree = ParseTree(NonTerminal(66, '_gen14')) | |
| tree.list = True; | |
| tree.list_separator_id = 44 | |
| ctx.nonterminal = "_gen14" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[66]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(66)): | |
| tree.add(parse_mapping(ctx)) | |
| ctx.nonterminal = "_gen14" # Horrible -- because parse_* can reset this | |
| if ctx.tokens.current() is not None and ctx.tokens.current().id == 44: | |
| tree.add(expect(ctx, 44)); | |
| else: | |
| break | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen15(ctx): | |
| tree = ParseTree(NonTerminal(93, '_gen15')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen15" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[93]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(93)): | |
| tree.add(parse_wf_output(ctx)) | |
| ctx.nonterminal = "_gen15" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen17(ctx): | |
| tree = ParseTree(NonTerminal(74, '_gen17')) | |
| tree.list = True; | |
| tree.list_separator_id = 44 | |
| ctx.nonterminal = "_gen17" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[74]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(74)): | |
| tree.add(parse_type_e(ctx)) | |
| ctx.nonterminal = "_gen17" # Horrible -- because parse_* can reset this | |
| if ctx.tokens.current() is not None and ctx.tokens.current().id == 44: | |
| tree.add(expect(ctx, 44)); | |
| else: | |
| break | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen18(ctx): | |
| tree = ParseTree(NonTerminal(73, '_gen18')) | |
| tree.list = True; | |
| tree.list_separator_id = 44 | |
| ctx.nonterminal = "_gen18" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[73]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(73)): | |
| tree.add(parse_e(ctx)) | |
| ctx.nonterminal = "_gen18" # Horrible -- because parse_* can reset this | |
| if ctx.tokens.current() is not None and ctx.tokens.current().id == 44: | |
| tree.add(expect(ctx, 44)); | |
| else: | |
| break | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen19(ctx): | |
| tree = ParseTree(NonTerminal(85, '_gen19')) | |
| tree.list = True; | |
| tree.list_separator_id = 44 | |
| ctx.nonterminal = "_gen19" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[85]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(85)): | |
| tree.add(parse_object_kv(ctx)) | |
| ctx.nonterminal = "_gen19" # Horrible -- because parse_* can reset this | |
| if ctx.tokens.current() is not None and ctx.tokens.current().id == 44: | |
| tree.add(expect(ctx, 44)); | |
| else: | |
| break | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen20(ctx): | |
| tree = ParseTree(NonTerminal(104, '_gen20')) | |
| tree.list = True; | |
| tree.list_separator_id = 44 | |
| ctx.nonterminal = "_gen20" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[104]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(104)): | |
| tree.add(parse_map_kv(ctx)) | |
| ctx.nonterminal = "_gen20" # Horrible -- because parse_* can reset this | |
| if ctx.tokens.current() is not None and ctx.tokens.current().id == 44: | |
| tree.add(expect(ctx, 44)); | |
| else: | |
| break | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen3(ctx): | |
| tree = ParseTree(NonTerminal(109, '_gen3')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen3" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[109]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(109)): | |
| tree.add(parse_declaration(ctx)) | |
| ctx.nonterminal = "_gen3" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen4(ctx): | |
| tree = ParseTree(NonTerminal(62, '_gen4')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen4" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[62]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(62)): | |
| tree.add(parse_sections(ctx)) | |
| ctx.nonterminal = "_gen4" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen5(ctx): | |
| tree = ParseTree(NonTerminal(78, '_gen5')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen5" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[78]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(78)): | |
| tree.add(parse_command_part(ctx)) | |
| ctx.nonterminal = "_gen5" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen6(ctx): | |
| tree = ParseTree(NonTerminal(118, '_gen6')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen6" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[118]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(118)): | |
| tree.add(parse_cmd_param_kv(ctx)) | |
| ctx.nonterminal = "_gen6" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen7(ctx): | |
| tree = ParseTree(NonTerminal(115, '_gen7')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen7" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[115]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(115)): | |
| tree.add(parse_output_kv(ctx)) | |
| ctx.nonterminal = "_gen7" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen8(ctx): | |
| tree = ParseTree(NonTerminal(61, '_gen8')) | |
| tree.list = True; | |
| ctx.nonterminal = "_gen8" | |
| if ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id not in nonterminal_first[118] and \ | |
| ctx.tokens.current().id in nonterminal_follow[61]: | |
| return tree; | |
| if ctx.tokens.current() is None: | |
| return tree | |
| minimum = 0; | |
| while minimum > 0 or \ | |
| (ctx.tokens.current() is not None and \ | |
| ctx.tokens.current().id in nonterminal_first.get(61)): | |
| tree.add(parse_kv(ctx)) | |
| ctx.nonterminal = "_gen8" # Horrible -- because parse_* can reset this | |
| minimum = max(minimum - 1, 0) | |
| return tree | |
| def parse__gen11(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[31][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(89, '_gen11')) | |
| ctx.nonterminal = "_gen11" | |
| if current != None and current.id in nonterminal_follow[89] and current.id not in nonterminal_first[89]: | |
| return tree | |
| if current == None: | |
| return tree | |
| if rule == 49: # $_gen11 = $alias | |
| ctx.rule = rules[49] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_alias(ctx) | |
| tree.add(subtree) | |
| return tree | |
| return tree | |
| def parse__gen12(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[5][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(63, '_gen12')) | |
| ctx.nonterminal = "_gen12" | |
| if current != None and current.id in nonterminal_follow[63] and current.id not in nonterminal_first[63]: | |
| return tree | |
| if current == None: | |
| return tree | |
| if rule == 51: # $_gen12 = $call_body | |
| ctx.rule = rules[51] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_call_body(ctx) | |
| tree.add(subtree) | |
| return tree | |
| return tree | |
| def parse__gen16(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[44][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(102, '_gen16')) | |
| ctx.nonterminal = "_gen16" | |
| if current != None and current.id in nonterminal_follow[102] and current.id not in nonterminal_first[102]: | |
| return tree | |
| if current == None: | |
| return tree | |
| if rule == 65: # $_gen16 = $wf_output_wildcard | |
| ctx.rule = rules[65] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_wf_output_wildcard(ctx) | |
| tree.add(subtree) | |
| return tree | |
| return tree | |
| def parse__gen2(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[1][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(59, '_gen2')) | |
| ctx.nonterminal = "_gen2" | |
| if current != None and current.id in nonterminal_follow[59] and current.id not in nonterminal_first[59]: | |
| return tree | |
| if current == None: | |
| return tree | |
| if rule == 6: # $_gen2 = $import_namespace | |
| ctx.rule = rules[6] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_import_namespace(ctx) | |
| tree.add(subtree) | |
| return tree | |
| return tree | |
| def parse__gen9(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[14][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(72, '_gen9')) | |
| ctx.nonterminal = "_gen9" | |
| if current != None and current.id in nonterminal_follow[72] and current.id not in nonterminal_first[72]: | |
| return tree | |
| if current == None: | |
| return tree | |
| if rule == 34: # $_gen9 = $setter | |
| ctx.rule = rules[34] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_setter(ctx) | |
| tree.add(subtree) | |
| return tree | |
| return tree | |
| def parse_alias(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[53][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(111, 'alias')) | |
| ctx.nonterminal = "alias" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 59: # $alias = :as :identifier -> $1 | |
| ctx.rule = rules[59] | |
| tree.astTransform = AstTransformSubstitution(1) | |
| t = expect(ctx, 16) # :as | |
| tree.add(t) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[111] if x >=0], | |
| rules[59] | |
| ) | |
| def parse_call(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[22][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(80, 'call')) | |
| ctx.nonterminal = "call" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 53: # $call = :call :fqn $_gen11 $_gen12 -> Call( task=$1, alias=$2, body=$3 ) | |
| ctx.rule = rules[53] | |
| ast_parameters = OrderedDict([ | |
| ('task', 1), | |
| ('alias', 2), | |
| ('body', 3), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Call', ast_parameters) | |
| t = expect(ctx, 14) # :call | |
| tree.add(t) | |
| t = expect(ctx, 22) # :fqn | |
| tree.add(t) | |
| subtree = parse__gen11(ctx) | |
| tree.add(subtree) | |
| subtree = parse__gen12(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[80] if x >=0], | |
| rules[53] | |
| ) | |
| def parse_call_body(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[39][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(97, 'call_body')) | |
| ctx.nonterminal = "call_body" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 55: # $call_body = :lbrace $_gen3 $_gen13 :rbrace -> CallBody( declarations=$1, io=$2 ) | |
| ctx.rule = rules[55] | |
| ast_parameters = OrderedDict([ | |
| ('declarations', 1), | |
| ('io', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('CallBody', ast_parameters) | |
| t = expect(ctx, 40) # :lbrace | |
| tree.add(t) | |
| subtree = parse__gen3(ctx) | |
| tree.add(subtree) | |
| subtree = parse__gen13(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 57) # :rbrace | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[97] if x >=0], | |
| rules[55] | |
| ) | |
| def parse_call_input(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[54][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(112, 'call_input')) | |
| ctx.nonterminal = "call_input" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 57: # $call_input = :input :colon $_gen14 -> Inputs( map=$2 ) | |
| ctx.rule = rules[57] | |
| ast_parameters = OrderedDict([ | |
| ('map', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Inputs', ast_parameters) | |
| t = expect(ctx, 48) # :input | |
| tree.add(t) | |
| t = expect(ctx, 21) # :colon | |
| tree.add(t) | |
| subtree = parse__gen14(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[112] if x >=0], | |
| rules[57] | |
| ) | |
| def parse_cmd_param(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[30][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(88, 'cmd_param')) | |
| ctx.nonterminal = "cmd_param" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 23: # $cmd_param = :cmd_param_start $_gen6 $e :cmd_param_end -> CommandParameter( attributes=$1, expr=$2 ) | |
| ctx.rule = rules[23] | |
| ast_parameters = OrderedDict([ | |
| ('attributes', 1), | |
| ('expr', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('CommandParameter', ast_parameters) | |
| t = expect(ctx, 5) # :cmd_param_start | |
| tree.add(t) | |
| subtree = parse__gen6(ctx) | |
| tree.add(subtree) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 47) # :cmd_param_end | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[88] if x >=0], | |
| rules[23] | |
| ) | |
| def parse_cmd_param_kv(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[21][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(79, 'cmd_param_kv')) | |
| ctx.nonterminal = "cmd_param_kv" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 24: # $cmd_param_kv = :cmd_attr_hint :identifier :equal $e -> CommandParameterAttr( key=$1, value=$3 ) | |
| ctx.rule = rules[24] | |
| ast_parameters = OrderedDict([ | |
| ('key', 1), | |
| ('value', 3), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('CommandParameterAttr', ast_parameters) | |
| t = expect(ctx, 18) # :cmd_attr_hint | |
| tree.add(t) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| t = expect(ctx, 46) # :equal | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[79] if x >=0], | |
| rules[24] | |
| ) | |
| def parse_command(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[28][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(86, 'command')) | |
| ctx.nonterminal = "command" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 19: # $command = :raw_command :raw_cmd_start $_gen5 :raw_cmd_end -> RawCommand( parts=$2 ) | |
| ctx.rule = rules[19] | |
| ast_parameters = OrderedDict([ | |
| ('parts', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('RawCommand', ast_parameters) | |
| t = expect(ctx, 34) # :raw_command | |
| tree.add(t) | |
| t = expect(ctx, 4) # :raw_cmd_start | |
| tree.add(t) | |
| subtree = parse__gen5(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 1) # :raw_cmd_end | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[86] if x >=0], | |
| rules[19] | |
| ) | |
| def parse_command_part(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[26][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(84, 'command_part')) | |
| ctx.nonterminal = "command_part" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 20: # $command_part = :cmd_part | |
| ctx.rule = rules[20] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| t = expect(ctx, 27) # :cmd_part | |
| tree.add(t) | |
| return tree | |
| elif rule == 21: # $command_part = $cmd_param | |
| ctx.rule = rules[21] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_cmd_param(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[84] if x >=0], | |
| rules[21] | |
| ) | |
| def parse_declaration(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[33][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(91, 'declaration')) | |
| ctx.nonterminal = "declaration" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 36: # $declaration = $type_e :identifier $_gen9 -> Declaration( type=$0, name=$1, expression=$2 ) | |
| ctx.rule = rules[36] | |
| ast_parameters = OrderedDict([ | |
| ('type', 0), | |
| ('name', 1), | |
| ('expression', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Declaration', ast_parameters) | |
| subtree = parse_type_e(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| subtree = parse__gen9(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[91] if x >=0], | |
| rules[36] | |
| ) | |
| def parse_document(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[43][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(101, 'document')) | |
| ctx.nonterminal = "document" | |
| if current != None and current.id in nonterminal_follow[101] and current.id not in nonterminal_first[101]: | |
| return tree | |
| if current == None: | |
| return tree | |
| if rule == 2: # $document = $_gen0 $_gen1 -> Namespace( imports=$0, body=$1 ) | |
| ctx.rule = rules[2] | |
| ast_parameters = OrderedDict([ | |
| ('imports', 0), | |
| ('body', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Namespace', ast_parameters) | |
| subtree = parse__gen0(ctx) | |
| tree.add(subtree) | |
| subtree = parse__gen1(ctx) | |
| tree.add(subtree) | |
| return tree | |
| return tree | |
| def parse_if_stmt(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[47][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(105, 'if_stmt')) | |
| ctx.nonterminal = "if_stmt" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 72: # $if_stmt = :if :lparen $e :rparen :lbrace $_gen10 :rbrace -> If( expression=$2, body=$5 ) | |
| ctx.rule = rules[72] | |
| ast_parameters = OrderedDict([ | |
| ('expression', 2), | |
| ('body', 5), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('If', ast_parameters) | |
| t = expect(ctx, 28) # :if | |
| tree.add(t) | |
| t = expect(ctx, 31) # :lparen | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 56) # :rparen | |
| tree.add(t) | |
| t = expect(ctx, 40) # :lbrace | |
| tree.add(t) | |
| subtree = parse__gen10(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 57) # :rbrace | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[105] if x >=0], | |
| rules[72] | |
| ) | |
| def parse_import(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[12][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(70, 'import')) | |
| ctx.nonterminal = "import" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 8: # $import = :import :string $_gen2 -> Import( uri=$1, namespace=$2 ) | |
| ctx.rule = rules[8] | |
| ast_parameters = OrderedDict([ | |
| ('uri', 1), | |
| ('namespace', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Import', ast_parameters) | |
| t = expect(ctx, 15) # :import | |
| tree.add(t) | |
| t = expect(ctx, 42) # :string | |
| tree.add(t) | |
| subtree = parse__gen2(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[70] if x >=0], | |
| rules[8] | |
| ) | |
| def parse_import_namespace(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[58][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(116, 'import_namespace')) | |
| ctx.nonterminal = "import_namespace" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 9: # $import_namespace = :as :identifier -> $1 | |
| ctx.rule = rules[9] | |
| tree.astTransform = AstTransformSubstitution(1) | |
| t = expect(ctx, 16) # :as | |
| tree.add(t) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[116] if x >=0], | |
| rules[9] | |
| ) | |
| def parse_kv(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[49][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(107, 'kv')) | |
| ctx.nonterminal = "kv" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 33: # $kv = :identifier :colon $e -> RuntimeAttribute( key=$0, value=$2 ) | |
| ctx.rule = rules[33] | |
| ast_parameters = OrderedDict([ | |
| ('key', 0), | |
| ('value', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('RuntimeAttribute', ast_parameters) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| t = expect(ctx, 21) # :colon | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[107] if x >=0], | |
| rules[33] | |
| ) | |
| def parse_map(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[34][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(92, 'map')) | |
| ctx.nonterminal = "map" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 32: # $map = :lbrace $_gen8 :rbrace -> $1 | |
| ctx.rule = rules[32] | |
| tree.astTransform = AstTransformSubstitution(1) | |
| t = expect(ctx, 40) # :lbrace | |
| tree.add(t) | |
| subtree = parse__gen8(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 57) # :rbrace | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[92] if x >=0], | |
| rules[32] | |
| ) | |
| def parse_map_kv(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[37][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(95, 'map_kv')) | |
| ctx.nonterminal = "map_kv" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 38: # $map_kv = $e :colon $e -> MapLiteralKv( key=$0, value=$2 ) | |
| ctx.rule = rules[38] | |
| ast_parameters = OrderedDict([ | |
| ('key', 0), | |
| ('value', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('MapLiteralKv', ast_parameters) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 21) # :colon | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[95] if x >=0], | |
| rules[38] | |
| ) | |
| def parse_mapping(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[25][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(83, 'mapping')) | |
| ctx.nonterminal = "mapping" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 58: # $mapping = :identifier :equal $e -> IOMapping( key=$0, value=$2 ) | |
| ctx.rule = rules[58] | |
| ast_parameters = OrderedDict([ | |
| ('key', 0), | |
| ('value', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('IOMapping', ast_parameters) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| t = expect(ctx, 46) # :equal | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[83] if x >=0], | |
| rules[58] | |
| ) | |
| def parse_meta(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[9][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(67, 'meta')) | |
| ctx.nonterminal = "meta" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 30: # $meta = :meta $map -> Meta( map=$1 ) | |
| ctx.rule = rules[30] | |
| ast_parameters = OrderedDict([ | |
| ('map', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Meta', ast_parameters) | |
| t = expect(ctx, 7) # :meta | |
| tree.add(t) | |
| subtree = parse_map(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[67] if x >=0], | |
| rules[30] | |
| ) | |
| def parse_object_kv(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[59][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(117, 'object_kv')) | |
| ctx.nonterminal = "object_kv" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 74: # $object_kv = :identifier :colon $e -> ObjectKV( key=$0, value=$2 ) | |
| ctx.rule = rules[74] | |
| ast_parameters = OrderedDict([ | |
| ('key', 0), | |
| ('value', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('ObjectKV', ast_parameters) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| t = expect(ctx, 21) # :colon | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[117] if x >=0], | |
| rules[74] | |
| ) | |
| def parse_output_kv(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[41][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(99, 'output_kv')) | |
| ctx.nonterminal = "output_kv" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 27: # $output_kv = $type_e :identifier :equal $e -> Output( type=$0, name=$1, expression=$3 ) | |
| ctx.rule = rules[27] | |
| ast_parameters = OrderedDict([ | |
| ('type', 0), | |
| ('name', 1), | |
| ('expression', 3), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Output', ast_parameters) | |
| subtree = parse_type_e(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| t = expect(ctx, 46) # :equal | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[99] if x >=0], | |
| rules[27] | |
| ) | |
| def parse_outputs(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[2][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(60, 'outputs')) | |
| ctx.nonterminal = "outputs" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 26: # $outputs = :output :lbrace $_gen7 :rbrace -> Outputs( attributes=$2 ) | |
| ctx.rule = rules[26] | |
| ast_parameters = OrderedDict([ | |
| ('attributes', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Outputs', ast_parameters) | |
| t = expect(ctx, 26) # :output | |
| tree.add(t) | |
| t = expect(ctx, 40) # :lbrace | |
| tree.add(t) | |
| subtree = parse__gen7(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 57) # :rbrace | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[60] if x >=0], | |
| rules[26] | |
| ) | |
| def parse_parameter_meta(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[45][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(103, 'parameter_meta')) | |
| ctx.nonterminal = "parameter_meta" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 29: # $parameter_meta = :parameter_meta $map -> ParameterMeta( map=$1 ) | |
| ctx.rule = rules[29] | |
| ast_parameters = OrderedDict([ | |
| ('map', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('ParameterMeta', ast_parameters) | |
| t = expect(ctx, 29) # :parameter_meta | |
| tree.add(t) | |
| subtree = parse_map(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[103] if x >=0], | |
| rules[29] | |
| ) | |
| def parse_runtime(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[36][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(94, 'runtime')) | |
| ctx.nonterminal = "runtime" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 28: # $runtime = :runtime $map -> Runtime( map=$1 ) | |
| ctx.rule = rules[28] | |
| ast_parameters = OrderedDict([ | |
| ('map', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Runtime', ast_parameters) | |
| t = expect(ctx, 2) # :runtime | |
| tree.add(t) | |
| subtree = parse_map(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[94] if x >=0], | |
| rules[28] | |
| ) | |
| def parse_scatter(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[55][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(113, 'scatter')) | |
| ctx.nonterminal = "scatter" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 73: # $scatter = :scatter :lparen :identifier :in $e :rparen :lbrace $_gen10 :rbrace -> Scatter( item=$2, collection=$4, body=$7 ) | |
| ctx.rule = rules[73] | |
| ast_parameters = OrderedDict([ | |
| ('item', 2), | |
| ('collection', 4), | |
| ('body', 7), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Scatter', ast_parameters) | |
| t = expect(ctx, 12) # :scatter | |
| tree.add(t) | |
| t = expect(ctx, 31) # :lparen | |
| tree.add(t) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| t = expect(ctx, 50) # :in | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 56) # :rparen | |
| tree.add(t) | |
| t = expect(ctx, 40) # :lbrace | |
| tree.add(t) | |
| subtree = parse__gen10(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 57) # :rbrace | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[113] if x >=0], | |
| rules[73] | |
| ) | |
| def parse_sections(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[52][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(110, 'sections')) | |
| ctx.nonterminal = "sections" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 13: # $sections = $command | |
| ctx.rule = rules[13] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_command(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 14: # $sections = $outputs | |
| ctx.rule = rules[14] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_outputs(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 15: # $sections = $runtime | |
| ctx.rule = rules[15] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_runtime(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 16: # $sections = $parameter_meta | |
| ctx.rule = rules[16] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_parameter_meta(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 17: # $sections = $meta | |
| ctx.rule = rules[17] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_meta(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[110] if x >=0], | |
| rules[17] | |
| ) | |
| def parse_setter(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[11][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(69, 'setter')) | |
| ctx.nonterminal = "setter" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 37: # $setter = :equal $e -> $1 | |
| ctx.rule = rules[37] | |
| tree.astTransform = AstTransformSubstitution(1) | |
| t = expect(ctx, 46) # :equal | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[69] if x >=0], | |
| rules[37] | |
| ) | |
| def parse_task(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[24][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(82, 'task')) | |
| ctx.nonterminal = "task" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 12: # $task = :task :identifier :lbrace $_gen3 $_gen4 :rbrace -> Task( name=$1, declarations=$3, sections=$4 ) | |
| ctx.rule = rules[12] | |
| ast_parameters = OrderedDict([ | |
| ('name', 1), | |
| ('declarations', 3), | |
| ('sections', 4), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Task', ast_parameters) | |
| t = expect(ctx, 39) # :task | |
| tree.add(t) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| t = expect(ctx, 40) # :lbrace | |
| tree.add(t) | |
| subtree = parse__gen3(ctx) | |
| tree.add(subtree) | |
| subtree = parse__gen4(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 57) # :rbrace | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[82] if x >=0], | |
| rules[12] | |
| ) | |
| def parse_wf_body_element(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[29][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(87, 'wf_body_element')) | |
| ctx.nonterminal = "wf_body_element" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 41: # $wf_body_element = $call | |
| ctx.rule = rules[41] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_call(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 42: # $wf_body_element = $declaration | |
| ctx.rule = rules[42] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_declaration(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 43: # $wf_body_element = $while_loop | |
| ctx.rule = rules[43] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_while_loop(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 44: # $wf_body_element = $if_stmt | |
| ctx.rule = rules[44] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_if_stmt(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 45: # $wf_body_element = $scatter | |
| ctx.rule = rules[45] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_scatter(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 46: # $wf_body_element = $wf_outputs | |
| ctx.rule = rules[46] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_wf_outputs(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 47: # $wf_body_element = $wf_parameter_meta | |
| ctx.rule = rules[47] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_wf_parameter_meta(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 48: # $wf_body_element = $wf_meta | |
| ctx.rule = rules[48] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_wf_meta(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[87] if x >=0], | |
| rules[48] | |
| ) | |
| def parse_wf_meta(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[56][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(114, 'wf_meta')) | |
| ctx.nonterminal = "wf_meta" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 70: # $wf_meta = :meta $map -> Meta( map=$1 ) | |
| ctx.rule = rules[70] | |
| ast_parameters = OrderedDict([ | |
| ('map', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Meta', ast_parameters) | |
| t = expect(ctx, 7) # :meta | |
| tree.add(t) | |
| subtree = parse_map(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[114] if x >=0], | |
| rules[70] | |
| ) | |
| def parse_wf_output(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[13][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(71, 'wf_output')) | |
| ctx.nonterminal = "wf_output" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 62: # $wf_output = $wf_output_declaration_syntax | |
| ctx.rule = rules[62] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_wf_output_declaration_syntax(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 63: # $wf_output = $wf_output_wildcard_syntax | |
| ctx.rule = rules[63] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_wf_output_wildcard_syntax(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[71] if x >=0], | |
| rules[63] | |
| ) | |
| def parse_wf_output_declaration_syntax(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[32][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(90, 'wf_output_declaration_syntax')) | |
| ctx.nonterminal = "wf_output_declaration_syntax" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 64: # $wf_output_declaration_syntax = $type_e :identifier :equal $e -> WorkflowOutputDeclaration( type=$0, name=$1, expression=$3 ) | |
| ctx.rule = rules[64] | |
| ast_parameters = OrderedDict([ | |
| ('type', 0), | |
| ('name', 1), | |
| ('expression', 3), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('WorkflowOutputDeclaration', ast_parameters) | |
| subtree = parse_type_e(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| t = expect(ctx, 46) # :equal | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[90] if x >=0], | |
| rules[64] | |
| ) | |
| def parse_wf_output_wildcard(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[23][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(81, 'wf_output_wildcard')) | |
| ctx.nonterminal = "wf_output_wildcard" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 68: # $wf_output_wildcard = :dot :asterisk -> $1 | |
| ctx.rule = rules[68] | |
| tree.astTransform = AstTransformSubstitution(1) | |
| t = expect(ctx, 23) # :dot | |
| tree.add(t) | |
| t = expect(ctx, 49) # :asterisk | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[81] if x >=0], | |
| rules[68] | |
| ) | |
| def parse_wf_output_wildcard_syntax(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[19][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(77, 'wf_output_wildcard_syntax')) | |
| ctx.nonterminal = "wf_output_wildcard_syntax" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 67: # $wf_output_wildcard_syntax = :fqn $_gen16 -> WorkflowOutputWildcard( fqn=$0, wildcard=$1 ) | |
| ctx.rule = rules[67] | |
| ast_parameters = OrderedDict([ | |
| ('fqn', 0), | |
| ('wildcard', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('WorkflowOutputWildcard', ast_parameters) | |
| t = expect(ctx, 22) # :fqn | |
| tree.add(t) | |
| subtree = parse__gen16(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[77] if x >=0], | |
| rules[67] | |
| ) | |
| def parse_wf_outputs(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[42][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(100, 'wf_outputs')) | |
| ctx.nonterminal = "wf_outputs" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 61: # $wf_outputs = :output :lbrace $_gen15 :rbrace -> WorkflowOutputs( outputs=$2 ) | |
| ctx.rule = rules[61] | |
| ast_parameters = OrderedDict([ | |
| ('outputs', 2), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('WorkflowOutputs', ast_parameters) | |
| t = expect(ctx, 26) # :output | |
| tree.add(t) | |
| t = expect(ctx, 40) # :lbrace | |
| tree.add(t) | |
| subtree = parse__gen15(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 57) # :rbrace | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[100] if x >=0], | |
| rules[61] | |
| ) | |
| def parse_wf_parameter_meta(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[7][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(65, 'wf_parameter_meta')) | |
| ctx.nonterminal = "wf_parameter_meta" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 69: # $wf_parameter_meta = :parameter_meta $map -> ParameterMeta( map=$1 ) | |
| ctx.rule = rules[69] | |
| ast_parameters = OrderedDict([ | |
| ('map', 1), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('ParameterMeta', ast_parameters) | |
| t = expect(ctx, 29) # :parameter_meta | |
| tree.add(t) | |
| subtree = parse_map(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[65] if x >=0], | |
| rules[69] | |
| ) | |
| def parse_while_loop(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[48][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(106, 'while_loop')) | |
| ctx.nonterminal = "while_loop" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 71: # $while_loop = :while :lparen $e :rparen :lbrace $_gen10 :rbrace -> WhileLoop( expression=$2, body=$5 ) | |
| ctx.rule = rules[71] | |
| ast_parameters = OrderedDict([ | |
| ('expression', 2), | |
| ('body', 5), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('WhileLoop', ast_parameters) | |
| t = expect(ctx, 10) # :while | |
| tree.add(t) | |
| t = expect(ctx, 31) # :lparen | |
| tree.add(t) | |
| subtree = parse_e(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 56) # :rparen | |
| tree.add(t) | |
| t = expect(ctx, 40) # :lbrace | |
| tree.add(t) | |
| subtree = parse__gen10(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 57) # :rbrace | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[106] if x >=0], | |
| rules[71] | |
| ) | |
| def parse_workflow(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[0][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(58, 'workflow')) | |
| ctx.nonterminal = "workflow" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 40: # $workflow = :workflow :identifier :lbrace $_gen10 :rbrace -> Workflow( name=$1, body=$3 ) | |
| ctx.rule = rules[40] | |
| ast_parameters = OrderedDict([ | |
| ('name', 1), | |
| ('body', 3), | |
| ]) | |
| tree.astTransform = AstTransformNodeCreator('Workflow', ast_parameters) | |
| t = expect(ctx, 25) # :workflow | |
| tree.add(t) | |
| t = expect(ctx, 17) # :identifier | |
| tree.add(t) | |
| t = expect(ctx, 40) # :lbrace | |
| tree.add(t) | |
| subtree = parse__gen10(ctx) | |
| tree.add(subtree) | |
| t = expect(ctx, 57) # :rbrace | |
| tree.add(t) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[58] if x >=0], | |
| rules[40] | |
| ) | |
| def parse_workflow_or_task_or_decl(ctx): | |
| current = ctx.tokens.current() | |
| rule = table[17][current.id] if current else -1 | |
| tree = ParseTree(NonTerminal(75, 'workflow_or_task_or_decl')) | |
| ctx.nonterminal = "workflow_or_task_or_decl" | |
| if current == None: | |
| raise ctx.errors.unexpected_eof() | |
| if rule == 3: # $workflow_or_task_or_decl = $workflow | |
| ctx.rule = rules[3] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_workflow(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 4: # $workflow_or_task_or_decl = $task | |
| ctx.rule = rules[4] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_task(ctx) | |
| tree.add(subtree) | |
| return tree | |
| elif rule == 5: # $workflow_or_task_or_decl = $declaration | |
| ctx.rule = rules[5] | |
| tree.astTransform = AstTransformSubstitution(0) | |
| subtree = parse_declaration(ctx) | |
| tree.add(subtree) | |
| return tree | |
| raise ctx.errors.unexpected_symbol( | |
| ctx.nonterminal, | |
| ctx.tokens.current(), | |
| [terminals[x] for x in nonterminal_first[75] if x >=0], | |
| rules[5] | |
| ) | |
| # Lexer Code # | |
| # START USER CODE | |
| def init(): | |
| return { | |
| 'context': None, | |
| 'replacements': { | |
| re.compile(r"\\n"): 0x000A, | |
| re.compile(r"\\r"): 0x000D, | |
| re.compile(r"\\b"): 0x0008, | |
| re.compile(r"\\t"): 0x0009, | |
| re.compile(r"\\a"): 0x0007, | |
| re.compile(r"\\v"): 0x000B, | |
| re.compile(r'\\"'): 0x0022, | |
| re.compile(r"\\'"): 0x0027, | |
| re.compile(r"\\\?"): 0x003F | |
| }, | |
| 'escapes': { | |
| re.compile(r'(\\([0-7]{1,3}))'): 8, | |
| re.compile(r'(\\[xX]([0-9a-fA-F]{1,4}))'): 16, | |
| re.compile(r'(\\[uU]([0-9a-fA-F]{4}))'): 16 | |
| } | |
| } | |
| def workflow(ctx, terminal, source_string, line, col): | |
| ctx.user_context['context'] = 'workflow' | |
| default_action(ctx, terminal, source_string, line, col) | |
| def task(ctx, terminal, source_string, line, col): | |
| ctx.user_context['context'] = 'task' | |
| default_action(ctx, terminal, source_string, line, col) | |
| def output(ctx, terminal, source_string, line, col): | |
| if ctx.user_context['context'] == 'workflow': | |
| ctx.stack.append('wf_output') | |
| default_action(ctx, terminal, source_string, line, col) | |
| def wdl_unescape(ctx, terminal, source_string, line, col): | |
| for regex, c in ctx.user_context['replacements'].items(): | |
| source_string = regex.sub(chr(c), source_string) | |
| source_string = source_string.replace("\u005C\u005C", "\u005C") | |
| for regex, base in ctx.user_context['escapes'].items(): | |
| for escape_sequence, number in regex.findall(source_string): | |
| source_string = source_string.replace(escape_sequence, chr(int(number, base))) | |
| default_action(ctx, terminal, source_string[1:-1], line, col) | |
| # END USER CODE | |
| def emit(ctx, terminal, source_string, line, col): | |
| if terminal: | |
| ctx.tokens.append(Terminal(terminals[terminal], terminal, source_string, ctx.resource, line, col)) | |
| def default_action(ctx, terminal, source_string, line, col): | |
| emit(ctx, terminal, source_string, line, col) | |
| def destroy(context): | |
| pass | |
| class LexerStackPush: | |
| def __init__(self, mode): | |
| self.mode = mode | |
| class LexerAction: | |
| def __init__(self, action): | |
| self.action = action | |
| class LexerContext: | |
| def __init__(self, string, resource, errors, user_context): | |
| self.__dict__.update(locals()) | |
| self.stack = ['default'] | |
| self.line = 1 | |
| self.col = 1 | |
| self.tokens = [] | |
| self.user_context = user_context | |
| self.re_match = None # https://docs.python.org/3/library/re.html#match-objects | |
| class HermesLexer: | |
| regex = { | |
| 'default': OrderedDict([ | |
| (re.compile(r'\s+'), [ | |
| # (terminal, group, function) | |
| ]), | |
| (re.compile(r'/\*(.*?)\*/', re.DOTALL), [ | |
| # (terminal, group, function) | |
| ]), | |
| (re.compile(r'#.*'), [ | |
| # (terminal, group, function) | |
| ]), | |
| (re.compile(r'task(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('task', 0, task), | |
| ]), | |
| (re.compile(r'(call)\s+'), [ | |
| # (terminal, group, function) | |
| ('call', 1, None), | |
| LexerStackPush('task_fqn'), | |
| ]), | |
| (re.compile(r'workflow(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('workflow', 0, workflow), | |
| ]), | |
| (re.compile(r'import(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('import', 0, None), | |
| ]), | |
| (re.compile(r'input(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('input', 0, None), | |
| ]), | |
| (re.compile(r'output(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('output', 0, output), | |
| ]), | |
| (re.compile(r'as(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('as', 0, None), | |
| ]), | |
| (re.compile(r'if(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('if', 0, None), | |
| ]), | |
| (re.compile(r'then(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('then', 0, None), | |
| ]), | |
| (re.compile(r'else(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('else', 0, None), | |
| ]), | |
| (re.compile(r'while(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('while', 0, None), | |
| ]), | |
| (re.compile(r'runtime(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('runtime', 0, None), | |
| ]), | |
| (re.compile(r'scatter(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('scatter', 0, None), | |
| LexerStackPush('scatter'), | |
| ]), | |
| (re.compile(r'command\s*(?=<<<)'), [ | |
| # (terminal, group, function) | |
| ('raw_command', 0, None), | |
| LexerStackPush('raw_command2'), | |
| ]), | |
| (re.compile(r'command\s*(?=\{)'), [ | |
| # (terminal, group, function) | |
| ('raw_command', 0, None), | |
| LexerStackPush('raw_command'), | |
| ]), | |
| (re.compile(r'parameter_meta(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('parameter_meta', 0, None), | |
| ]), | |
| (re.compile(r'meta(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('meta', 0, None), | |
| ]), | |
| (re.compile(r'(true|false)(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('boolean', 0, None), | |
| ]), | |
| (re.compile(r'(object)\s*(\{)'), [ | |
| # (terminal, group, function) | |
| ('object', 0, None), | |
| ('lbrace', 0, None), | |
| ]), | |
| (re.compile(r'(Array|Map|Object|Pair|Boolean|Int|Float|Uri|File|String)(?![a-zA-Z0-9_])(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('type', 0, None), | |
| ]), | |
| (re.compile(r'[a-zA-Z]([a-zA-Z0-9_])*'), [ | |
| # (terminal, group, function) | |
| ('identifier', 0, None), | |
| ]), | |
| (re.compile(r'"([^\\\"\n]|\\[\\"\'nrbtfav\?]|\\[0-7]{1,3}|\\x[0-9a-fA-F]+|\\[uU]([0-9a-fA-F]{4})([0-9a-fA-F]{4})?)*"'), [ | |
| # (terminal, group, function) | |
| ('string', 0, wdl_unescape), | |
| ]), | |
| (re.compile(r'\'([^\\\'\n]|\\[\\"\'nrbtfav\?]|\\[0-7]{1,3}|\\x[0-9a-fA-F]+|\\[uU]([0-9a-fA-F]{4})([0-9a-fA-F]{4})?)*\''), [ | |
| # (terminal, group, function) | |
| ('string', 0, wdl_unescape), | |
| ]), | |
| (re.compile(r':'), [ | |
| # (terminal, group, function) | |
| ('colon', 0, None), | |
| ]), | |
| (re.compile(r','), [ | |
| # (terminal, group, function) | |
| ('comma', 0, None), | |
| ]), | |
| (re.compile(r'=='), [ | |
| # (terminal, group, function) | |
| ('double_equal', 0, None), | |
| ]), | |
| (re.compile(r'\|\|'), [ | |
| # (terminal, group, function) | |
| ('double_pipe', 0, None), | |
| ]), | |
| (re.compile(r'\&\&'), [ | |
| # (terminal, group, function) | |
| ('double_ampersand', 0, None), | |
| ]), | |
| (re.compile(r'!='), [ | |
| # (terminal, group, function) | |
| ('not_equal', 0, None), | |
| ]), | |
| (re.compile(r'='), [ | |
| # (terminal, group, function) | |
| ('equal', 0, None), | |
| ]), | |
| (re.compile(r'\.'), [ | |
| # (terminal, group, function) | |
| ('dot', 0, None), | |
| ]), | |
| (re.compile(r'\{'), [ | |
| # (terminal, group, function) | |
| ('lbrace', 0, None), | |
| ]), | |
| (re.compile(r'\}'), [ | |
| # (terminal, group, function) | |
| ('rbrace', 0, None), | |
| ]), | |
| (re.compile(r'\('), [ | |
| # (terminal, group, function) | |
| ('lparen', 0, None), | |
| ]), | |
| (re.compile(r'\)'), [ | |
| # (terminal, group, function) | |
| ('rparen', 0, None), | |
| ]), | |
| (re.compile(r'\['), [ | |
| # (terminal, group, function) | |
| ('lsquare', 0, None), | |
| ]), | |
| (re.compile(r'\]'), [ | |
| # (terminal, group, function) | |
| ('rsquare', 0, None), | |
| ]), | |
| (re.compile(r'\+'), [ | |
| # (terminal, group, function) | |
| ('plus', 0, None), | |
| ]), | |
| (re.compile(r'\*'), [ | |
| # (terminal, group, function) | |
| ('asterisk', 0, None), | |
| ]), | |
| (re.compile(r'-'), [ | |
| # (terminal, group, function) | |
| ('dash', 0, None), | |
| ]), | |
| (re.compile(r'/'), [ | |
| # (terminal, group, function) | |
| ('slash', 0, None), | |
| ]), | |
| (re.compile(r'%'), [ | |
| # (terminal, group, function) | |
| ('percent', 0, None), | |
| ]), | |
| (re.compile(r'<='), [ | |
| # (terminal, group, function) | |
| ('lteq', 0, None), | |
| ]), | |
| (re.compile(r'<'), [ | |
| # (terminal, group, function) | |
| ('lt', 0, None), | |
| ]), | |
| (re.compile(r'>='), [ | |
| # (terminal, group, function) | |
| ('gteq', 0, None), | |
| ]), | |
| (re.compile(r'>'), [ | |
| # (terminal, group, function) | |
| ('gt', 0, None), | |
| ]), | |
| (re.compile(r'!'), [ | |
| # (terminal, group, function) | |
| ('not', 0, None), | |
| ]), | |
| (re.compile(r'\?'), [ | |
| # (terminal, group, function) | |
| ('qmark', 0, None), | |
| ]), | |
| (re.compile(r'-?[0-9]+\.[0-9]+'), [ | |
| # (terminal, group, function) | |
| ('float', 0, None), | |
| ]), | |
| (re.compile(r'[0-9]+'), [ | |
| # (terminal, group, function) | |
| ('integer', 0, None), | |
| ]), | |
| ]), | |
| 'wf_output': OrderedDict([ | |
| (re.compile(r'\s+'), [ | |
| # (terminal, group, function) | |
| ]), | |
| (re.compile(r'#.*'), [ | |
| # (terminal, group, function) | |
| ]), | |
| (re.compile(r'(Array|Map|Object|Pair|Boolean|Int|Float|Uri|File|String)(?![a-zA-Z0-9_])(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('type', 0, None), | |
| LexerAction('pop'), | |
| LexerStackPush('wf_output_declaration'), | |
| ]), | |
| (re.compile(r'\{'), [ | |
| # (terminal, group, function) | |
| ('lbrace', 0, None), | |
| ]), | |
| (re.compile(r'\}'), [ | |
| # (terminal, group, function) | |
| ('rbrace', 0, None), | |
| LexerAction('pop'), | |
| ]), | |
| (re.compile(r','), [ | |
| # (terminal, group, function) | |
| ('comma', 0, None), | |
| ]), | |
| (re.compile(r'\.'), [ | |
| # (terminal, group, function) | |
| ('dot', 0, None), | |
| ]), | |
| (re.compile(r'\*'), [ | |
| # (terminal, group, function) | |
| ('asterisk', 0, None), | |
| ]), | |
| (re.compile(r'[a-zA-Z]([a-zA-Z0-9_])*(\.[a-zA-Z]([a-zA-Z0-9_])*)*'), [ | |
| # (terminal, group, function) | |
| ('fqn', 0, None), | |
| ]), | |
| ]), | |
| 'wf_output_declaration': OrderedDict([ | |
| (re.compile(r'\s+'), [ | |
| # (terminal, group, function) | |
| ]), | |
| (re.compile(r'#.*'), [ | |
| # (terminal, group, function) | |
| ]), | |
| (re.compile(r'\}'), [ | |
| # (terminal, group, function) | |
| ('rbrace', 0, None), | |
| LexerAction('pop'), | |
| ]), | |
| (re.compile(r'\['), [ | |
| # (terminal, group, function) | |
| ('lsquare', 0, None), | |
| ]), | |
| (re.compile(r'\]'), [ | |
| # (terminal, group, function) | |
| ('rsquare', 0, None), | |
| ]), | |
| (re.compile(r'\+'), [ | |
| # (terminal, group, function) | |
| ('plus', 0, None), | |
| ]), | |
| (re.compile(r'\*'), [ | |
| # (terminal, group, function) | |
| ('asterisk', 0, None), | |
| ]), | |
| (re.compile(r'[0-9]+'), [ | |
| # (terminal, group, function) | |
| ('integer', 0, None), | |
| ]), | |
| (re.compile(r'(true|false)(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('boolean', 0, None), | |
| ]), | |
| (re.compile(r'if'), [ | |
| # (terminal, group, function) | |
| ('if', 0, None), | |
| ]), | |
| (re.compile(r'else'), [ | |
| # (terminal, group, function) | |
| ('else', 0, None), | |
| ]), | |
| (re.compile(r'then'), [ | |
| # (terminal, group, function) | |
| ('then', 0, None), | |
| ]), | |
| (re.compile(r'(Array|Map|Object|Pair|Boolean|Int|Float|Uri|File|String)(?![a-zA-Z0-9_])(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('type', 0, None), | |
| ]), | |
| (re.compile(r'[a-zA-Z]([a-zA-Z0-9_])*'), [ | |
| # (terminal, group, function) | |
| ('identifier', 0, None), | |
| ]), | |
| (re.compile(r':'), [ | |
| # (terminal, group, function) | |
| ('colon', 0, None), | |
| ]), | |
| (re.compile(r','), [ | |
| # (terminal, group, function) | |
| ('comma', 0, None), | |
| ]), | |
| (re.compile(r'\.'), [ | |
| # (terminal, group, function) | |
| ('dot', 0, None), | |
| ]), | |
| (re.compile(r'=='), [ | |
| # (terminal, group, function) | |
| ('double_equal', 0, None), | |
| ]), | |
| (re.compile(r'='), [ | |
| # (terminal, group, function) | |
| ('equal', 0, None), | |
| ]), | |
| (re.compile(r'\|\|'), [ | |
| # (terminal, group, function) | |
| ('double_pipe', 0, None), | |
| ]), | |
| (re.compile(r'\&\&'), [ | |
| # (terminal, group, function) | |
| ('double_ampersand', 0, None), | |
| ]), | |
| (re.compile(r'!='), [ | |
| # (terminal, group, function) | |
| ('not_equal', 0, None), | |
| ]), | |
| (re.compile(r'='), [ | |
| # (terminal, group, function) | |
| ('equal', 0, None), | |
| ]), | |
| (re.compile(r'\.'), [ | |
| # (terminal, group, function) | |
| ('dot', 0, None), | |
| ]), | |
| (re.compile(r'\{'), [ | |
| # (terminal, group, function) | |
| ('lbrace', 0, None), | |
| ]), | |
| (re.compile(r'\('), [ | |
| # (terminal, group, function) | |
| ('lparen', 0, None), | |
| ]), | |
| (re.compile(r'\)'), [ | |
| # (terminal, group, function) | |
| ('rparen', 0, None), | |
| ]), | |
| (re.compile(r'\['), [ | |
| # (terminal, group, function) | |
| ('lsquare', 0, None), | |
| ]), | |
| (re.compile(r'\]'), [ | |
| # (terminal, group, function) | |
| ('rsquare', 0, None), | |
| ]), | |
| (re.compile(r'\+'), [ | |
| # (terminal, group, function) | |
| ('plus', 0, None), | |
| ]), | |
| (re.compile(r'\*'), [ | |
| # (terminal, group, function) | |
| ('asterisk', 0, None), | |
| ]), | |
| (re.compile(r'-'), [ | |
| # (terminal, group, function) | |
| ('dash', 0, None), | |
| ]), | |
| (re.compile(r'/'), [ | |
| # (terminal, group, function) | |
| ('slash', 0, None), | |
| ]), | |
| (re.compile(r'%'), [ | |
| # (terminal, group, function) | |
| ('percent', 0, None), | |
| ]), | |
| (re.compile(r'<='), [ | |
| # (terminal, group, function) | |
| ('lteq', 0, None), | |
| ]), | |
| (re.compile(r'<'), [ | |
| # (terminal, group, function) | |
| ('lt', 0, None), | |
| ]), | |
| (re.compile(r'>='), [ | |
| # (terminal, group, function) | |
| ('gteq', 0, None), | |
| ]), | |
| (re.compile(r'>'), [ | |
| # (terminal, group, function) | |
| ('gt', 0, None), | |
| ]), | |
| (re.compile(r'!'), [ | |
| # (terminal, group, function) | |
| ('not', 0, None), | |
| ]), | |
| (re.compile(r'\?'), [ | |
| # (terminal, group, function) | |
| ('qmark', 0, None), | |
| ]), | |
| (re.compile(r'"([^\\\"\n]|\\[\\"\'nrbtfav\?]|\\[0-7]{1,3}|\\x[0-9a-fA-F]+|\\[uU]([0-9a-fA-F]{4})([0-9a-fA-F]{4})?)*"'), [ | |
| # (terminal, group, function) | |
| ('string', 0, wdl_unescape), | |
| ]), | |
| (re.compile(r'\'([^\\\'\n]|\\[\\"\'nrbtfav\?]|\\[0-7]{1,3}|\\x[0-9a-fA-F]+|\\[uU]([0-9a-fA-F]{4})([0-9a-fA-F]{4})?)*\''), [ | |
| # (terminal, group, function) | |
| ('string', 0, wdl_unescape), | |
| ]), | |
| (re.compile(r'-?[0-9]+\.[0-9]+'), [ | |
| # (terminal, group, function) | |
| ('float', 0, None), | |
| ]), | |
| (re.compile(r'[0-9]+'), [ | |
| # (terminal, group, function) | |
| ('integer', 0, None), | |
| ]), | |
| ]), | |
| 'task_fqn': OrderedDict([ | |
| (re.compile(r'\s+'), [ | |
| # (terminal, group, function) | |
| ]), | |
| (re.compile(r'[a-zA-Z]([a-zA-Z0-9_])*(\.[a-zA-Z]([a-zA-Z0-9_])*)*'), [ | |
| # (terminal, group, function) | |
| ('fqn', 0, None), | |
| LexerAction('pop'), | |
| ]), | |
| ]), | |
| 'scatter': OrderedDict([ | |
| (re.compile(r'\s+'), [ | |
| # (terminal, group, function) | |
| ]), | |
| (re.compile(r'\('), [ | |
| # (terminal, group, function) | |
| ('lparen', 0, None), | |
| ]), | |
| (re.compile(r'in(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('in', 0, None), | |
| LexerAction('pop'), | |
| ]), | |
| (re.compile(r'[a-zA-Z]([a-zA-Z0-9_])*'), [ | |
| # (terminal, group, function) | |
| ('identifier', 0, None), | |
| ]), | |
| ]), | |
| 'raw_command': OrderedDict([ | |
| (re.compile(r'\{'), [ | |
| # (terminal, group, function) | |
| ('raw_cmd_start', 0, None), | |
| ]), | |
| (re.compile(r'\}'), [ | |
| # (terminal, group, function) | |
| ('raw_cmd_end', 0, None), | |
| LexerAction('pop'), | |
| ]), | |
| (re.compile(r'\$\{'), [ | |
| # (terminal, group, function) | |
| ('cmd_param_start', 0, None), | |
| LexerStackPush('cmd_param'), | |
| ]), | |
| (re.compile(r'(.*?)(?=\$\{|\})', re.DOTALL), [ | |
| # (terminal, group, function) | |
| ('cmd_part', 0, None), | |
| ]), | |
| ]), | |
| 'raw_command2': OrderedDict([ | |
| (re.compile(r'<<<'), [ | |
| # (terminal, group, function) | |
| ('raw_cmd_start', 0, None), | |
| ]), | |
| (re.compile(r'>>>'), [ | |
| # (terminal, group, function) | |
| ('raw_cmd_end', 0, None), | |
| LexerAction('pop'), | |
| ]), | |
| (re.compile(r'\$\{'), [ | |
| # (terminal, group, function) | |
| ('cmd_param_start', 0, None), | |
| LexerStackPush('cmd_param'), | |
| ]), | |
| (re.compile(r'(.*?)(?=\$\{|>>>)', re.DOTALL), [ | |
| # (terminal, group, function) | |
| ('cmd_part', 0, None), | |
| ]), | |
| ]), | |
| 'cmd_param': OrderedDict([ | |
| (re.compile(r'\s+'), [ | |
| # (terminal, group, function) | |
| ]), | |
| (re.compile(r'\}'), [ | |
| # (terminal, group, function) | |
| ('cmd_param_end', 0, None), | |
| LexerAction('pop'), | |
| ]), | |
| (re.compile(r'\['), [ | |
| # (terminal, group, function) | |
| ('lsquare', 0, None), | |
| ]), | |
| (re.compile(r'\]'), [ | |
| # (terminal, group, function) | |
| ('rsquare', 0, None), | |
| ]), | |
| (re.compile(r'='), [ | |
| # (terminal, group, function) | |
| ('equal', 0, None), | |
| ]), | |
| (re.compile(r'\+'), [ | |
| # (terminal, group, function) | |
| ('plus', 0, None), | |
| ]), | |
| (re.compile(r'\*'), [ | |
| # (terminal, group, function) | |
| ('asterisk', 0, None), | |
| ]), | |
| (re.compile(r'[0-9]+'), [ | |
| # (terminal, group, function) | |
| ('integer', 0, None), | |
| ]), | |
| (re.compile(r'if'), [ | |
| # (terminal, group, function) | |
| ('if', 0, None), | |
| ]), | |
| (re.compile(r'else'), [ | |
| # (terminal, group, function) | |
| ('else', 0, None), | |
| ]), | |
| (re.compile(r'then'), [ | |
| # (terminal, group, function) | |
| ('then', 0, None), | |
| ]), | |
| (re.compile(r'[a-zA-Z]([a-zA-Z0-9_])*(?=\s*=)'), [ | |
| # (terminal, group, function) | |
| ('cmd_attr_hint', None, None), | |
| ('identifier', 0, None), | |
| ]), | |
| (re.compile(r'(true|false)(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('boolean', 0, None), | |
| ]), | |
| (re.compile(r'(Array|Map|Object|Pair|Boolean|Int|Float|Uri|File|String)(?![a-zA-Z0-9_])(?![a-zA-Z0-9_])'), [ | |
| # (terminal, group, function) | |
| ('type', 0, None), | |
| ]), | |
| (re.compile(r'[a-zA-Z]([a-zA-Z0-9_])*'), [ | |
| # (terminal, group, function) | |
| ('identifier', 0, None), | |
| ]), | |
| (re.compile(r':'), [ | |
| # (terminal, group, function) | |
| ('colon', 0, None), | |
| ]), | |
| (re.compile(r','), [ | |
| # (terminal, group, function) | |
| ('comma', 0, None), | |
| ]), | |
| (re.compile(r'\.'), [ | |
| # (terminal, group, function) | |
| ('dot', 0, None), | |
| ]), | |
| (re.compile(r'=='), [ | |
| # (terminal, group, function) | |
| ('double_equal', 0, None), | |
| ]), | |
| (re.compile(r'\|\|'), [ | |
| # (terminal, group, function) | |
| ('double_pipe', 0, None), | |
| ]), | |
| (re.compile(r'\&\&'), [ | |
| # (terminal, group, function) | |
| ('double_ampersand', 0, None), | |
| ]), | |
| (re.compile(r'!='), [ | |
| # (terminal, group, function) | |
| ('not_equal', 0, None), | |
| ]), | |
| (re.compile(r'='), [ | |
| # (terminal, group, function) | |
| ('equal', 0, None), | |
| ]), | |
| (re.compile(r'\.'), [ | |
| # (terminal, group, function) | |
| ('dot', 0, None), | |
| ]), | |
| (re.compile(r'\{'), [ | |
| # (terminal, group, function) | |
| ('lbrace', 0, None), | |
| ]), | |
| (re.compile(r'\('), [ | |
| # (terminal, group, function) | |
| ('lparen', 0, None), | |
| ]), | |
| (re.compile(r'\)'), [ | |
| # (terminal, group, function) | |
| ('rparen', 0, None), | |
| ]), | |
| (re.compile(r'\['), [ | |
| # (terminal, group, function) | |
| ('lsquare', 0, None), | |
| ]), | |
| (re.compile(r'\]'), [ | |
| # (terminal, group, function) | |
| ('rsquare', 0, None), | |
| ]), | |
| (re.compile(r'\+'), [ | |
| # (terminal, group, function) | |
| ('plus', 0, None), | |
| ]), | |
| (re.compile(r'\*'), [ | |
| # (terminal, group, function) | |
| ('asterisk', 0, None), | |
| ]), | |
| (re.compile(r'-'), [ | |
| # (terminal, group, function) | |
| ('dash', 0, None), | |
| ]), | |
| (re.compile(r'/'), [ | |
| # (terminal, group, function) | |
| ('slash', 0, None), | |
| ]), | |
| (re.compile(r'%'), [ | |
| # (terminal, group, function) | |
| ('percent', 0, None), | |
| ]), | |
| (re.compile(r'<='), [ | |
| # (terminal, group, function) | |
| ('lteq', 0, None), | |
| ]), | |
| (re.compile(r'<'), [ | |
| # (terminal, group, function) | |
| ('lt', 0, None), | |
| ]), | |
| (re.compile(r'>='), [ | |
| # (terminal, group, function) | |
| ('gteq', 0, None), | |
| ]), | |
| (re.compile(r'>'), [ | |
| # (terminal, group, function) | |
| ('gt', 0, None), | |
| ]), | |
| (re.compile(r'!'), [ | |
| # (terminal, group, function) | |
| ('not', 0, None), | |
| ]), | |
| (re.compile(r'"([^\\\"\n]|\\[\\"\'nrbtfav\?]|\\[0-7]{1,3}|\\x[0-9a-fA-F]+|\\[uU]([0-9a-fA-F]{4})([0-9a-fA-F]{4})?)*"'), [ | |
| # (terminal, group, function) | |
| ('string', 0, wdl_unescape), | |
| ]), | |
| (re.compile(r'\'([^\\\'\n]|\\[\\"\'nrbtfav\?]|\\[0-7]{1,3}|\\x[0-9a-fA-F]+|\\[uU]([0-9a-fA-F]{4})([0-9a-fA-F]{4})?)*\''), [ | |
| # (terminal, group, function) | |
| ('string', 0, wdl_unescape), | |
| ]), | |
| (re.compile(r'-?[0-9]+\.[0-9]+'), [ | |
| # (terminal, group, function) | |
| ('float', 0, None), | |
| ]), | |
| (re.compile(r'[0-9]+'), [ | |
| # (terminal, group, function) | |
| ('integer', 0, None), | |
| ]), | |
| ]), | |
| } | |
| def _advance_line_col(self, string, length, line, col): | |
| for i in range(length): | |
| if string[i] == '\n': | |
| line += 1 | |
| col = 1 | |
| else: | |
| col += 1 | |
| return (line, col) | |
| def _advance_string(self, ctx, string): | |
| (ctx.line, ctx.col) = self._advance_line_col(string, len(string), ctx.line, ctx.col) | |
| ctx.string = ctx.string[len(string):] | |
| def _next(self, ctx, debug=False): | |
| for regex, outputs in self.regex[ctx.stack[-1]].items(): | |
| if debug: | |
| from xtermcolor import colorize | |
| token_count = len(ctx.tokens) | |
| print('{1} ({2}, {3}) regex: {0}'.format( | |
| colorize(regex.pattern, ansi=40), colorize(ctx.string[:20].replace('\n', '\\n'), ansi=15), ctx.line, ctx.col) | |
| ) | |
| match = regex.match(ctx.string) | |
| if match: | |
| ctx.re_match = match | |
| for output in outputs: | |
| if isinstance(output, tuple): | |
| (terminal, group, function) = output | |
| function = function if function else default_action | |
| source_string = match.group(group) if group is not None else '' | |
| (group_line, group_col) = self._advance_line_col(ctx.string, match.start(group) if group else 0, ctx.line, ctx.col) | |
| function( | |
| ctx, | |
| terminal, | |
| source_string, | |
| group_line, | |
| group_col | |
| ) | |
| if debug: | |
| print(' matched: {}'.format(colorize(match.group(0).replace('\n', '\\n'), ansi=3))) | |
| for token in ctx.tokens[token_count:]: | |
| print(' emit: [{}] [{}, {}] [{}] stack:{} context:{}'.format( | |
| colorize(token.str, ansi=9), | |
| colorize(str(token.line), ansi=5), | |
| colorize(str(token.col), ansi=5), | |
| colorize(token.source_string, ansi=3), | |
| colorize(str(ctx.stack), ansi=4), | |
| colorize(str(ctx.user_context), ansi=13) | |
| )) | |
| token_count = len(ctx.tokens) | |
| if isinstance(output, LexerStackPush): | |
| ctx.stack.append(output.mode) | |
| if debug: | |
| print(' push on stack: {}'.format(colorize(output.mode, ansi=4))) | |
| if isinstance(output, LexerAction): | |
| if output.action == 'pop': | |
| mode = ctx.stack.pop() | |
| if debug: | |
| print(' pop off stack: {}'.format(colorize(mode, ansi=4))) | |
| self._advance_string(ctx, match.group(0)) | |
| return len(match.group(0)) > 0 | |
| return False | |
| def lex(self, string, resource, errors=None, debug=False): | |
| if errors is None: | |
| errors = DefaultSyntaxErrorHandler() | |
| string_copy = string | |
| user_context = init() | |
| ctx = LexerContext(string, resource, errors, user_context) | |
| while len(ctx.string): | |
| matched = self._next(ctx, debug) | |
| if matched == False: | |
| raise ctx.errors.unrecognized_token(string_copy, ctx.line, ctx.col) | |
| destroy(ctx.user_context) | |
| return ctx.tokens | |
| def lex(source, resource, errors=None, debug=False): | |
| return TokenStream(HermesLexer().lex(source, resource, errors, debug)) |