コード例 #1
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)
コード例 #2
0
ファイル: Main.py プロジェクト: fizixer/cAST
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 = 'cAST: C Preprocessor and Parser')
  commands = dict()
  subparsers = parser.add_subparsers(help='Available actions', dest='command')
  commands['pp'] = subparsers.add_parser('pp', help='Preprocess.')
  commands['pptok'] = subparsers.add_parser('pptok', help='Tokenize C preprocessor.')
  commands['ppast'] = subparsers.add_parser('ppast', help='Parse C preprocessor.')
  commands['ctok'] = subparsers.add_parser('ctok', help='Preprocess and tokenize C code.')
  commands['cparse'] = subparsers.add_parser('cparse', help='Parse C code')
  commands['ast'] = subparsers.add_parser('ast', help='Parse C code and transform parse tree into an AST')

  parser.add_argument('source_file',
              metavar = 'SOURCE_FILE',
              nargs = 1,
              help = 'C Source File')
  
  parser.add_argument('-d', '--debug',
              action='store_true',
              help = 'Writes debug information')
  
  parser.add_argument('--skip-includes',
              action='store_true',
              help = 'Don\'t process #include directives')
  
  parser.add_argument('-e', '--encoding',
              help = 'File encoding')

  parser.add_argument('-I', '--include-path',
              default = '',
              help = "A path containing the list of directories separated by colons.")

  parser.add_argument('-c', '--color',
              action='store_true',
              help = "Colorize output to stdout.")

  parser.add_argument('--highlight',
              action='store_true',
              help = "Colorize tokens belonging to this AST node.")

  cli = parser.parse_args()
  logger = LoggerFactory().initialize(cli.debug)
  #logger.debug('CLI Parameters: {}'.format(cli))

  if not os.path.isfile( cli.source_file[0] ) and \
     not os.path.islink( cli.source_file[0] ):
    sys.stderr.write("Error: Source file does not exist\n")
    sys.exit(-1)

  if not len(cli.source_file) or not cli.source_file[0]:
    cSourcePath = open('/dev/stdin')
  else:
    cSourcePath = cli.source_file[0]

  try:
    cSourceFp = open(cSourcePath, encoding='utf-8')
  except UnicodeDecodeError:
    cSourceFp = open(cSourcePath, encoding='iso-8859-1')

  cSourceCode = SourceCode(cSourcePath, cSourceFp)

  target = subprocess.check_output(["gcc", "-dumpmachine"]).decode('ascii').strip()
  include_path_global = ['/usr/include', '/usr/local/include', 'usr/' + target + '/include']
  include_path_global.extend( list(filter(lambda x: x, cli.include_path.split(':'))) )
  include_path_local = [os.path.dirname(os.path.abspath(cSourcePath))]

  cPPFactory = PreProcessorFactory()
  #cPP = cPPFactory.create( include_path_global, include_path_local, skipIncludes=cli.skip_includes )
  cPP = cPPFactory.createLikeGcc()

  if cli.command == 'pp':
    try:
      (cT, symbols) = cPP.process(cSourceCode)
      parser = c_Parser()
      parsetree = parser.parse(TokenStream(cT))
      ast = parsetree.toAst()

      factory = HermesParserFactory()   
      fp = GrammarFileParser(factory.create())

      from pkg_resources import Requirement, resource_filename
      filename = resource_filename(__name__, '../grammars/c.zgr')

      grammar = fp.parse( 'c', open(filename) )
      print(cT.toString(parsetree=parsetree, grammar=grammar, ast=ast, highlight=cli.highlight))
    except Exception as e:
      print(e, '\n', e.tracer)
      sys.exit(-1)

  if cli.command == 'pptok':
    for token in ppLexer(cSourceCode):
      print(token.toString())

  if cli.command == 'ppast':
    try:
      cPPL = TokenStream(ppLexer(cSourceCode))
      parser = pp_Parser()
      parsetree = parser.parse(cPPL)
      ast = parsetree.toAst()
      print(AstPrettyPrintable(ast, color=cli.color))
    except Exception as e:
      print(e, '\n', e.tracer)
      sys.exit(-1)

  if cli.command == 'ctok':
    try:
      cT, symbols = cPP.process( cSourceCode )
      for token in cT:
        print(token.toString())
    except Exception as e:
      print(e, '\n', e.tracer)
      sys.exit(-1)

  if cli.command == 'cparse':
    try:
      cT, symbols = cPP.process( cSourceCode )
      parsetree = c_Parser().parse(TokenStream(cT))
      print(ParseTreePrettyPrintable(parsetree, color=cli.color))
    except Exception as e:
      print(e, '\n', e.tracer)
      sys.exit(-1)

  if cli.command == 'ast':
    try:
      cT, symbols = cPP.process( cSourceCode )
      parser = c_Parser()
      parsetree = parser.parse(TokenStream(cT))
      ast = parsetree.toAst()
      print(AstPrettyPrintable(ast, color=cli.color))
    except Exception as e:
      print(e, '\n', e.tracer)
      sys.exit(-1)
コード例 #3
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)