예제 #1
0
  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)
예제 #2
0
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
예제 #3
0
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)
예제 #4
0
  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)
예제 #5
0
파일: bootstrap.py 프로젝트: fizixer/cAST
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
예제 #6
0
파일: Main.py 프로젝트: pombreda/hermes
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)
예제 #7
0
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)