Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
_whitespace = intern("_whitespace")
# }}}
_LEX_TABLE = [
(_and, RE(r"and\b")),
(_or, RE(r"or\b")),
(_not, RE(r"not\b")),
(_openpar, RE(r"\(")),
(_closepar, RE(r"\)")),
# TERMINALS
(_id, RE(r"id:([\w?*]+)")),
(_tag, RE(r"tag:([\w?*]+)")),
(_writes, RE(r"writes:([\w?*]+)")),
(_reads, RE(r"reads:([\w?*]+)")),
(_iname, RE(r"iname:([\w?*]+)")),
(_whitespace, RE("[ \t]+")),
]
_TERMINALS = ([_id, _tag, _writes, _reads, _iname])
# {{{ operator precedence
_PREC_OR = 10
_PREC_AND = 20
_PREC_NOT = 30
r"[0-9]+(\.[0-9]*)?[eEdD][+-]?[0-9]+([a-zA-Z]*)\b"),
# has digits after the dot (before optional)
pytools.lex.RE(
r"[0-9]*\.[0-9]+([eEdD][+-]?[0-9]+)?([a-zA-Z]*)"),
pytools.lex.RE(
r"[0-9]*\.[0-9]+[eEdD][+-]?[0-9]+([a-zA-Z]*)\b"),
# has a letter tag
pytools.lex.RE(r"[0-9]+([a-zA-Z]+)"),
)),
(_int, pytools.lex.RE(r"[0-9]+")),
(_plus, pytools.lex.RE(r"\+")),
(_minus, pytools.lex.RE(r"-")),
(_power, pytools.lex.RE(r"\*\*")),
(_times, pytools.lex.RE(r"\*")),
(_floordiv, pytools.lex.RE(r"//")),
(_over, pytools.lex.RE(r"/")),
(_modulo, pytools.lex.RE(r"%")),
(_bitwiseand, pytools.lex.RE(r"\&")),
(_bitwiseor, pytools.lex.RE(r"\|")),
(_bitwisenot, pytools.lex.RE(r"\~")),
(_bitwisexor, pytools.lex.RE(r"\^")),
(_openpar, pytools.lex.RE(r"\(")),
(_closepar, pytools.lex.RE(r"\)")),
(_openbracket, pytools.lex.RE(r"\[")),
(_closebracket, pytools.lex.RE(r"\]")),
(_identifier, pytools.lex.RE(r"[@$a-z_A-Z_][@$a-zA-Z_0-9]*")),
(_whitespace, pytools.lex.RE("[ \n\t]*")),
(_comma, pytools.lex.RE(",")),
(_dot, pytools.lex.RE(r"\.")),
_closepar = intern("closepar")
_id = intern("_id")
_tag = intern("_tag")
_writes = intern("_writes")
_reads = intern("_reads")
_iname = intern("_iname")
_whitespace = intern("_whitespace")
# }}}
_LEX_TABLE = [
(_and, RE(r"and\b")),
(_or, RE(r"or\b")),
(_not, RE(r"not\b")),
(_openpar, RE(r"\(")),
(_closepar, RE(r"\)")),
# TERMINALS
(_id, RE(r"id:([\w?*]+)")),
(_tag, RE(r"tag:([\w?*]+)")),
(_writes, RE(r"writes:([\w?*]+)")),
(_reads, RE(r"reads:([\w?*]+)")),
(_iname, RE(r"iname:([\w?*]+)")),
(_whitespace, RE("[ \t]+")),
]
_TERMINALS = ([_id, _tag, _writes, _reads, _iname])
return expr
class FortranExpressionParser(ExpressionParserBase):
# FIXME double/single prec literals
lex_table = [
(_less_than, pytools.lex.RE(r"\.lt\.", re.I)),
(_greater_than, pytools.lex.RE(r"\.gt\.", re.I)),
(_less_equal, pytools.lex.RE(r"\.le\.", re.I)),
(_greater_equal, pytools.lex.RE(r"\.ge\.", re.I)),
(_equal, pytools.lex.RE(r"\.eq\.", re.I)),
(_not_equal, pytools.lex.RE(r"\.ne\.", re.I)),
(_not, pytools.lex.RE(r"\.not\.", re.I)),
(_and, pytools.lex.RE(r"\.and\.", re.I)),
(_or, pytools.lex.RE(r"\.or\.", re.I)),
] + ExpressionParserBase.lex_table
def __init__(self, tree_walker):
self.tree_walker = tree_walker
_PREC_FUNC_ARGS = 1
def parse_terminal(self, pstate):
scope = self.tree_walker.scope_stack[-1]
from pymbolic.parser import (
_identifier, _openpar, _closepar, _float)
next_tag = pstate.next_tag()
if next_tag is _float:
(_leftshift, pytools.lex.RE(r"\<\<")),
(_rightshift, pytools.lex.RE(r"\>\>")),
(_lessequal, pytools.lex.RE(r"\<=")),
(_greaterequal, pytools.lex.RE(r"\>=")),
# must be before
(_less, pytools.lex.RE(r"\<")),
(_greater, pytools.lex.RE(r"\>")),
(_assign, pytools.lex.RE(r"=")),
(_and, pytools.lex.RE(r"and\b")),
(_or, pytools.lex.RE(r"or\b")),
(_not, pytools.lex.RE(r"not\b")),
(_imaginary, (_float, pytools.lex.RE("j"))),
(_float, ("|",
# has digits before the dot (after optional)
pytools.lex.RE(
r"[0-9]+\.[0-9]*([eEdD][+-]?[0-9]+)?([a-zA-Z]*)"),
pytools.lex.RE(
r"[0-9]+(\.[0-9]*)?[eEdD][+-]?[0-9]+([a-zA-Z]*)\b"),
# has digits after the dot (before optional)
pytools.lex.RE(
r"[0-9]*\.[0-9]+([eEdD][+-]?[0-9]+)?([a-zA-Z]*)"),
pytools.lex.RE(
r"[0-9]*\.[0-9]+[eEdD][+-]?[0-9]+([a-zA-Z]*)\b"),
# has a letter tag
pytools.lex.RE(r"[0-9]+([a-zA-Z]+)"),
)),
(_int, pytools.lex.RE(r"[0-9]+")),
and p.is_constant(expr.children[0])
and expr.children[0] == -1):
tl = expr.children[1]
return TypedLiteral("-"+tl.value, tl.dtype)
else:
return expr
class FortranExpressionParser(ExpressionParserBase):
# FIXME double/single prec literals
lex_table = [
(_less_than, pytools.lex.RE(r"\.lt\.", re.I)),
(_greater_than, pytools.lex.RE(r"\.gt\.", re.I)),
(_less_equal, pytools.lex.RE(r"\.le\.", re.I)),
(_greater_equal, pytools.lex.RE(r"\.ge\.", re.I)),
(_equal, pytools.lex.RE(r"\.eq\.", re.I)),
(_not_equal, pytools.lex.RE(r"\.ne\.", re.I)),
(_not, pytools.lex.RE(r"\.not\.", re.I)),
(_and, pytools.lex.RE(r"\.and\.", re.I)),
(_or, pytools.lex.RE(r"\.or\.", re.I)),
] + ExpressionParserBase.lex_table
def __init__(self, tree_walker):
self.tree_walker = tree_walker
_PREC_FUNC_ARGS = 1
def parse_terminal(self, pstate):
scope = self.tree_walker.scope_stack[-1]
(_int, pytools.lex.RE(r"[0-9]+")),
(_plus, pytools.lex.RE(r"\+")),
(_minus, pytools.lex.RE(r"-")),
(_power, pytools.lex.RE(r"\*\*")),
(_times, pytools.lex.RE(r"\*")),
(_floordiv, pytools.lex.RE(r"//")),
(_over, pytools.lex.RE(r"/")),
(_modulo, pytools.lex.RE(r"%")),
(_bitwiseand, pytools.lex.RE(r"\&")),
(_bitwiseor, pytools.lex.RE(r"\|")),
(_bitwisenot, pytools.lex.RE(r"\~")),
(_bitwisexor, pytools.lex.RE(r"\^")),
(_openpar, pytools.lex.RE(r"\(")),
(_closepar, pytools.lex.RE(r"\)")),
(_openbracket, pytools.lex.RE(r"\[")),
(_closebracket, pytools.lex.RE(r"\]")),
(_identifier, pytools.lex.RE(r"[@$a-z_A-Z_][@$a-zA-Z_0-9]*")),
(_whitespace, pytools.lex.RE("[ \n\t]*")),
(_comma, pytools.lex.RE(",")),
(_dot, pytools.lex.RE(r"\.")),
(_colon, pytools.lex.RE(r"\:")),
]
_COMP_TABLE = {
_greater: ">",
_greaterequal: ">=",
_less: "<",
_lessequal: "<=",
_equal: "==",
because they were terminated by a closing delimiter.
"""
class FinalizedTuple(tuple, FinalizedContainer):
pass
class FinalizedList(list, FinalizedContainer):
pass
class Parser(object):
lex_table = [
(_equal, pytools.lex.RE(r"==")),
(_notequal, pytools.lex.RE(r"!=")),
(_equal, pytools.lex.RE(r"==")),
(_leftshift, pytools.lex.RE(r"\<\<")),
(_rightshift, pytools.lex.RE(r"\>\>")),
(_lessequal, pytools.lex.RE(r"\<=")),
(_greaterequal, pytools.lex.RE(r"\>=")),
# must be before
(_less, pytools.lex.RE(r"\<")),
(_greater, pytools.lex.RE(r"\>")),
(_assign, pytools.lex.RE(r"=")),
(_and, pytools.lex.RE(r"and\b")),
(_or, pytools.lex.RE(r"or\b")),
(_not, pytools.lex.RE(r"not\b")),
# {{{ expression parser
class FortranExpressionParser(ExpressionParserBase):
lex_table = [
(_less_than, pytools.lex.RE(r"\.lt\.", re.I)),
(_greater_than, pytools.lex.RE(r"\.gt\.", re.I)),
(_less_equal, pytools.lex.RE(r"\.le\.", re.I)),
(_greater_equal, pytools.lex.RE(r"\.ge\.", re.I)),
(_equal, pytools.lex.RE(r"\.eq\.", re.I)),
(_not_equal, pytools.lex.RE(r"\.ne\.", re.I)),
(_not, pytools.lex.RE(r"\.not\.", re.I)),
(_and, pytools.lex.RE(r"\.and\.", re.I)),
(_or, pytools.lex.RE(r"\.or\.", re.I)),
] + ExpressionParserBase.lex_table
def __init__(self, tree_walker):
self.tree_walker = tree_walker
_PREC_FUNC_ARGS = 1
def parse_terminal(self, pstate):
scope = self.tree_walker.scope_stack[-1]
from pymbolic.primitives import Subscript, Call, Variable
from pymbolic.parser import (
_identifier, _openpar, _closepar, _float)
next_tag = pstate.next_tag()
if next_tag is _float:
# must be before
(_less, pytools.lex.RE(r"\<")),
(_greater, pytools.lex.RE(r"\>")),
(_assign, pytools.lex.RE(r"=")),
(_and, pytools.lex.RE(r"and\b")),
(_or, pytools.lex.RE(r"or\b")),
(_not, pytools.lex.RE(r"not\b")),
(_imaginary, (_float, pytools.lex.RE("j"))),
(_float, ("|",
# has digits before the dot (after optional)
pytools.lex.RE(
r"[0-9]+\.[0-9]*([eEdD][+-]?[0-9]+)?([a-zA-Z]*)"),
pytools.lex.RE(
r"[0-9]+(\.[0-9]*)?[eEdD][+-]?[0-9]+([a-zA-Z]*)\b"),
# has digits after the dot (before optional)
pytools.lex.RE(
r"[0-9]*\.[0-9]+([eEdD][+-]?[0-9]+)?([a-zA-Z]*)"),
pytools.lex.RE(
r"[0-9]*\.[0-9]+[eEdD][+-]?[0-9]+([a-zA-Z]*)\b"),
# has a letter tag
pytools.lex.RE(r"[0-9]+([a-zA-Z]+)"),
)),
(_int, pytools.lex.RE(r"[0-9]+")),
(_plus, pytools.lex.RE(r"\+")),
(_minus, pytools.lex.RE(r"-")),
(_power, pytools.lex.RE(r"\*\*")),
(_times, pytools.lex.RE(r"\*")),
(_floordiv, pytools.lex.RE(r"//")),