def runJavaParser(self, grammar, testCaseDir, arg): tmpDir = tempfile.mkdtemp() shutil.copy(os.path.join(testCaseDir, 'tokens'), tmpDir) shutil.copytree(os.path.join(testCaseDir, '..', 'javacp', 'org'), os.path.join(tmpDir, 'org')) templateFactory = TemplateFactoryFactory().create('java') templateWriter = TemplateWriter(templateFactory) templateWriter.write([grammar], tmpDir, addMain=True) javaSourceFiles = list(filter(lambda filename: filename.endswith('.java'), os.listdir(tmpDir))) try: compileCmd = 'javac *.java 2>/dev/null' subprocess.check_call(compileCmd, cwd=tmpDir, shell=True, stderr=None) except subprocess.CalledProcessError as error: print('FAILED TO COMPILE', testCaseDir) shutil.rmtree(tmpDir) return error.output.decode('utf-8').strip() try: runCmd = 'java ParserMain grammar {type} 2>&1 <tokens'.format(type=arg) return subprocess.check_output(runCmd, shell=True, stderr=None, cwd=tmpDir).decode('utf-8').strip() except subprocess.CalledProcessError as exception: return exception.output.decode('utf-8').strip() finally: shutil.rmtree(tmpDir)
def getPythonParser(grammar): global hermesparser templateFactory = TemplateFactoryFactory().create('python') templateWriter = TemplateWriter(templateFactory) templateWriter.write([grammar], '.', addMain=True) try: os.remove('__pycache__/hermesparser.cpython-32.pyc') except OSError: pass hermesparser = imp.load_source('hermesparser', 'grammar_Parser.py') parser = hermesparser.grammar_Parser() return parser
def getAst(grammar, testCaseDir): tmpDir = tempfile.mkdtemp() shutil.copy(os.path.join(testCaseDir, 'tokens'), tmpDir) templateFactory = TemplateFactoryFactory().create('python') templateWriter = TemplateWriter(templateFactory) templateWriter.write([grammar], tmpDir, addMain=True) try: runCmd = 'python ParserMain.py grammar ast < tokens 2>&1' return subprocess.check_output(runCmd, shell=True, stderr=None, cwd=tmpDir).decode('utf-8').strip() except subprocess.CalledProcessError as exception: return exception.output.decode('utf-8').strip() finally: shutil.rmtree(tmpDir)
def runCParser(self, grammar, testCaseDir, arg): tmpDir = tempfile.mkdtemp() shutil.copy(os.path.join(testCaseDir, 'tokens'), tmpDir) templateFactory = TemplateFactoryFactory().create('c') templateWriter = TemplateWriter(templateFactory) templateWriter.write([grammar], tmpDir, addMain=True) cSourceFiles = list(filter(lambda x: x != 'tokens', os.listdir(tmpDir))) try: compileCmd = 'gcc -o parser {sources} -g -Wall -pedantic -ansi -std=c99 2>/dev/null'.format(sources=' '.join(cSourceFiles)) subprocess.check_call(compileCmd, cwd=tmpDir, shell=True, stderr=None) except subprocess.CalledProcessError as error: shutil.rmtree(tmpDir) return error.output.decode('utf-8').strip() try: runCmd = './parser grammar {type} < tokens'.format(type=arg) return subprocess.check_output(runCmd, shell=True, stderr=None, cwd=tmpDir).decode('utf-8').strip() except subprocess.CalledProcessError as exception: return exception.output.decode('utf-8').strip() finally: shutil.rmtree(tmpDir)
import sys try: from hermes.GrammarCodeGenerator import TemplateWriter from hermes.GrammarCodeGenerator import FactoryFactory as TemplateFactoryFactory from hermes.GrammarFileParser import GrammarFileParser, HermesParserFactory except: sys.stderr.write('Hermes is not installed. Cannot bootstrap.\n') sys.exit(-1) grammars = [ ('pp', 'grammars/pp.zgr'), ('c', 'grammars/c.zgr') ] cGrammars = [] for name, grammarFile in grammars: print('generating parser for grammar %s' % (grammarFile)) grammarFileParser = GrammarFileParser(HermesParserFactory().create()) cGrammars.append( grammarFileParser.parse( name, open(grammarFile) ) ) templateFactory = TemplateFactoryFactory().create('python') templateWriter = TemplateWriter(templateFactory) templateWriter.write(cGrammars, 'cast', addMain=False) import setup
def Cli(): ver = sys.version_info # Version 3.2 required for argparse if ver.major < 3 or (ver.major == 3 and ver.minor < 2): print("Python 3.2+ required. %d.%d.%d installed" %(ver.major, ver.minor, ver.micro)) sys.exit(-1) parser = argparse.ArgumentParser( description = 'Hermes Parser Generator', epilog = '(c) 2011-2012 Scott Frazer') parser.add_argument('action', choices = ['analyze', 'generate'], help = 'Parser Generator Actions') parser.add_argument('grammar', metavar = 'GRAMMAR', nargs = '+', help = 'Grammar file') parser.add_argument('--version', action='version', version=str(pkg_resources.get_distribution('hermes-parser'))) parser.add_argument('-D', '--debug', required = False, action='store_true', help = 'Open the floodgates') parser.add_argument('-d', '--directory', required=False, default='.', help='Directory to write generated code to') parser.add_argument('-l', '--language', required = False, default='python', choices=['c', 'java', 'python'], help = 'Language for generated parser') parser.add_argument('--java-package', required = False, help = 'If generating Java code, this is the package.') parser.add_argument('-c', '--color', required = False, action = 'store_true', help = 'Prints things in color! For the colorblind, this is a no-op.') parser.add_argument('-m', '--add-main', required = False, action = 'store_true', help = 'If this is specified, a main() function will be generated in the source code.') cli = parser.parse_args() logger = LoggerFactory().initialize(cli.debug) logger.debug('CLI Parameters: %s' % (cli)) factory = HermesParserFactory() fp = GrammarFileParser(factory.create()) grammars = [] for grammar in cli.grammar: if not os.path.isfile( grammar ): sys.stderr.write("Error: Grammar file doesn't exist\n") sys.exit(-1) name = os.path.basename(grammar) if not name.endswith('.zgr'): sys.stderr.write("Error: Grammar file must have .zgr extension\n") sys.exit(-1) name = name[:-4] grammars.append( fp.parse(name, open(grammar)) ) if cli.action == 'analyze': if cli.color: theme = TerminalColorTheme() else: theme = TerminalDefaultTheme() for grammar in grammars: analyzer = GrammarAnalyzer(grammar) analyzer.analyze( theme=theme ) if cli.action == 'generate': cli.directory = os.path.abspath(os.path.expanduser(cli.directory)) if not os.path.isdir( cli.directory ): sys.stderr.write("Error: Directory doesn't exist\n") sys.exit(-1) elif not os.access(cli.directory, os.W_OK): sys.stderr.write("Error: Directory not writable\n") sys.exit(-1) templateFactory = TemplateFactoryFactory().create(outputLanguage=cli.language.lower()) templateWriter = TemplateWriter(templateFactory) templateWriter.write(grammars, cli.directory, addMain=cli.add_main, javaPackage=cli.java_package)
def Cli(): ver = sys.version_info # Version 3.2 required for argparse if ver.major < 3 or (ver.major == 3 and ver.minor < 2): print("Python 3.2+ required. %d.%d.%d installed" % (ver.major, ver.minor, ver.micro)) sys.exit(-1) parser = argparse.ArgumentParser(description='Hermes Parser Generator', epilog='(c) 2011-2012 Scott Frazer') parser.add_argument('action', choices=['analyze', 'generate'], help='Parser Generator Actions') parser.add_argument('grammar', metavar='GRAMMAR', nargs='+', help='Grammar file') parser.add_argument('--version', action='version', version=str( pkg_resources.get_distribution('hermes-parser'))) parser.add_argument('-D', '--debug', required=False, action='store_true', help='Open the floodgates') parser.add_argument('-d', '--directory', required=False, default='.', help='Directory to write generated code to') parser.add_argument('-l', '--language', required=False, default='python', choices=['c', 'java', 'python'], help='Language for generated parser') parser.add_argument('--java-package', required=False, help='If generating Java code, this is the package.') parser.add_argument( '-c', '--color', required=False, action='store_true', help='Prints things in color! For the colorblind, this is a no-op.') parser.add_argument( '-m', '--add-main', required=False, action='store_true', help= 'If this is specified, a main() function will be generated in the source code.' ) cli = parser.parse_args() logger = LoggerFactory().initialize(cli.debug) logger.debug('CLI Parameters: %s' % (cli)) factory = HermesParserFactory() fp = GrammarFileParser(factory.create()) grammars = [] for grammar in cli.grammar: if not os.path.isfile(grammar): sys.stderr.write("Error: Grammar file doesn't exist\n") sys.exit(-1) name = os.path.basename(grammar) if not name.endswith('.zgr'): sys.stderr.write("Error: Grammar file must have .zgr extension\n") sys.exit(-1) name = name[:-4] grammars.append(fp.parse(name, open(grammar))) if cli.action == 'analyze': if cli.color: theme = TerminalColorTheme() else: theme = TerminalDefaultTheme() for grammar in grammars: analyzer = GrammarAnalyzer(grammar) analyzer.analyze(theme=theme) if cli.action == 'generate': cli.directory = os.path.abspath(os.path.expanduser(cli.directory)) if not os.path.isdir(cli.directory): sys.stderr.write("Error: Directory doesn't exist\n") sys.exit(-1) elif not os.access(cli.directory, os.W_OK): sys.stderr.write("Error: Directory not writable\n") sys.exit(-1) templateFactory = TemplateFactoryFactory().create( outputLanguage=cli.language.lower()) templateWriter = TemplateWriter(templateFactory) templateWriter.write(grammars, cli.directory, addMain=cli.add_main, javaPackage=cli.java_package)