Permalink
Fetching contributors…
Cannot retrieve contributors at this time
3898 lines (3896 sloc) 150 KB
# 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))