Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
the name referencing the kernel in the algorithm layer. The name \
provided and the name of the kernel in the parse tree are case \
insensitive in this function.
:param ast: parse tree of the kernel module code
:type ast: :py:class:`fparser.one.block_statements.BeginSource`
:returns: Parse tree of the metadata (a Fortran type with name \
'name')
:rtype: :py:class:`fparser.one.block_statements.Type`
:raises ParseError: if the metadata type name is not found in \
the kernel code parse tree
'''
ktype = None
for statement, _ in fpapi.walk(ast, -1):
if isinstance(statement, fparser1.block_statements.Type) \
and statement.name.lower() == name.lower():
ktype = statement
break
if ktype is None:
raise ParseError("Kernel type {0} does not exist".format(name))
return ktype
from config import DEFAULTAPI
api=DEFAULTAPI
else:
from config import SUPPORTEDAPIS
if api not in SUPPORTEDAPIS:
raise ParseError("parse: Unsupported API '{0}' specified. Supported types are {1}.".format(api, SUPPORTEDAPIS))
from pyparsing import ParseException
# drop cache
fparser.parsefortran.FortranParser.cache.clear()
fparser.logging.disable('CRITICAL')
if not os.path.isfile(alg_filename):
raise IOError("File %s not found" % alg_filename)
try:
ast = fpapi.parse(alg_filename, ignore_comments = False, analyze = False)
# ast includes an extra comment line which contains file
# details. This line can be long which can cause line length
# issues. Therefore set the information (name) to be empty.
ast.name = ""
except:
import traceback
traceback.print_exc()
raise ParseError("Fatal error in external fparser tool")
if line_length:
fll = FortLineLength()
with open (alg_filename, "r") as myfile:
code_str=myfile.read()
if fll.long_lines(code_str):
raise ParseError(
"parse: the algorithm file does not conform to the specified"
" {0} line length limit".format(str(fll.length)))
'''Parse the file in filepath with fparser1 and return a parse tree.
:param str filepath: path to a file (hopefully) containing \
PSyclone kernel code.
:returns: Parse tree of the kernel code contained in the specified \
file.
:rtype: :py:class:`fparser.one.block_statements.BeginSource`
:raises ParseError: if fparser fails to parse the file
'''
parsefortran.FortranParser.cache.clear()
fparser.logging.disable(fparser.logging.CRITICAL)
try:
parse_tree = fpapi.parse(filepath)
# parse_tree includes an extra comment line which contains
# file details. This line can be long which can cause line
# length issues. Therefore set the information (name) to be
# empty.
parse_tree.name = ""
except Exception:
raise ParseError(
"Failed to parse kernel code '{0}'. Is the Fortran "
"correct?".format(filepath))
return parse_tree
'''Parse the file in filepath with fparser1 and return a parse tree.
:param str filepath: path to a file (hopefully) containing \
PSyclone kernel code.
:returns: Parse tree of the kernel code contained in the specified \
file.
:rtype: :py:class:`fparser.one.block_statements.BeginSource`
:raises ParseError: if fparser fails to parse the file
'''
parsefortran.FortranParser.cache.clear()
fparser.logging.disable(fparser.logging.CRITICAL)
try:
parse_tree = fpapi.parse(filepath)
# parse_tree includes an extra comment line which contains
# file details. This line can be long which can cause line
# length issues. Therefore set the information (name) to be
# empty.
parse_tree.name = ""
except Exception:
raise ParseError(
"Failed to parse kernel code '{0}'. Is the Fortran "
"correct?".format(filepath))
return parse_tree
api = DEFAULTSTUBAPI
if api not in SUPPORTEDSTUBAPIS:
print "Unsupported API '{0}' specified. Supported API's are {1}.".\
format(api, SUPPORTEDSTUBAPIS)
raise GenerationError(
"generate: Unsupported API '{0}' specified. Supported types are "
"{1}.".format(api, SUPPORTEDSTUBAPIS))
if not os.path.isfile(filename):
raise IOError("file '{0}' not found".format(filename))
# drop cache
fparser.parsefortran.FortranParser.cache.clear()
fparser.logging.disable('CRITICAL')
try:
ast = fpapi.parse(filename, ignore_comments=False)
except AttributeError:
raise ParseError("Code appears to be invalid Fortran")
metadata = DynKernMetadata(ast)
kernel = DynKern()
kernel.load_meta(metadata)
return kernel.gen_stub
def __init__(self, name="", contains=True, implicitnone=True):
from fparser import api
code = '''\
module vanilla
'''
if contains:
code += '''\
contains
'''
code += '''\
end module vanilla
'''
tree = api.parse(code, ignore_comments=False)
module = tree.content[0]
module.name = name
endmod = module.content[len(module.content)-1]
endmod.name = name
ProgUnitGen.__init__(self, None, module)
if implicitnone:
self.add(ImplicitNoneGen(self))
fname = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
builtin_defs_file)
if not os.path.isfile(fname):
from psyclone.parse import ParseError
raise ParseError(
"Kernel '{0}' is a recognised Built-in but cannot "
"find file '{1}' containing the meta-data describing "
"the Built-in operations for API '{2}'".format(name,
fname,
self._type))
# Attempt to parse the meta-data
try:
parsefortran.FortranParser.cache.clear()
fparser.logging.disable(fparser.logging.CRITICAL)
ast = fpapi.parse(fname)
except:
from psyclone.parse import ParseError
raise ParseError(
"Failed to parse the meta-data for PSyclone "
"built-ins in {0}".format(fname))
# Now we have the AST, call our parent class to create the object
return KernelTypeFactory.create(self, ast, name)
api = Config.get().default_stub_api
if api not in Config.get().supported_stub_apis:
print("Unsupported API '{0}' specified. Supported API's are {1}.".
format(api, Config.get().supported_stub_apis))
raise GenerationError(
"generate: Unsupported API '{0}' specified. Supported types are "
"{1}.".format(api, Config.get().supported_stub_apis))
if not os.path.isfile(filename):
raise IOError("file '{0}' not found".format(filename))
# drop cache
fparser.one.parsefortran.FortranParser.cache.clear()
fparser.logging.disable(fparser.logging.CRITICAL)
try:
ast = fparser.api.parse(filename, ignore_comments=False)
except (fparser.common.utils.AnalyzeError, AttributeError) as error:
raise ParseError("Code appears to be invalid Fortran: " +
str(error))
metadata = DynKernMetadata(ast)
kernel = DynKern()
kernel.load_meta(metadata)
return kernel.gen_stub
# The meta-data for these lives in a Fortran module file
# passed in to this method.
fname = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
builtin_defs_file)
if not os.path.isfile(fname):
raise ParseError(
"BuiltInKernelTypeFactory:create Kernel '{0}' is a recognised "
"Built-in but cannot find file '{1}' containing the meta-data "
"describing the Built-in operations for API '{2}'"
.format(name, fname, self._type))
# Attempt to parse the meta-data
try:
parsefortran.FortranParser.cache.clear()
fparser.logging.disable(fparser.logging.CRITICAL)
parse_tree = fpapi.parse(fname)
except Exception:
raise ParseError(
"BuiltInKernelTypeFactory:create: Failed to parse the meta-"
"data for PSyclone built-ins in file '{0}'.".format(fname))
# Now we have the parse tree, call our parent class to create \
# the object
return KernelTypeFactory.create(self, parse_tree, name)
# pylint: enable=too-few-public-methods
def __init__(self, name="", contains=True, implicitnone=True):
from fparser import api
code = '''\
module vanilla
'''
if contains:
code += '''\
contains
'''
code += '''\
end module vanilla
'''
tree = api.parse(code, ignore_comments=False)
module = tree.content[0]
module.name = name
endmod = module.content[len(module.content)-1]
endmod.name = name
ProgUnitGen.__init__(self, None, module)
if implicitnone:
self.add(ImplicitNoneGen(self))