Example #1
0
 def test_escape_sequences(self):
     self.assertEqual(u'\n', eval_escapes(r'\n'))
     self.assertEqual(u'this \xeds a test',
                      eval_escapes(r'this \xeds a test'))
     self.assertEqual(u'this ís a test', eval_escapes(r'this \xeds a test'))
     self.assertEqual(u'\nañez', eval_escapes(r'\na\xf1ez'))
     self.assertEqual(u'\nañez', eval_escapes(r'\nañez'))
Example #2
0
def main(codegen=pythoncg, outer_version=''):
    argparser.add_argument(
        '-v', '--version',
        help='provide version information and exit',
        action='version',
        version=outer_version + __version__
    )
    try:
        args = argparser.parse_args()
    except Exception as e:
        _error(str(e))
        sys.exit(2)

    binary = args.binary
    filename = args.filename
    name = args.name
    nameguard = args.nameguard
    draw = args.draw
    outfile = args.output
    pretty = args.pretty
    trace = args.trace
    whitespace = args.whitespace
    left_recursion = args.left_recursion

    if whitespace:
        whitespace = eval_escapes(args.whitespace)

    if binary and not outfile:
        _error('--binary requires --outfile')
        sys.exit(2)

    if draw and not outfile:
        _error('--draw requires --outfile')
        sys.exit(2)

    if sum((binary, draw, pretty)) > 1:
        _error('either --binary or --draw or --pretty')
        sys.exit(2)

    if name is None:
        name = os.path.splitext(os.path.basename(filename))[0]

    if outfile and os.path.isfile(outfile):
        os.unlink(outfile)

    grammar = codecs.open(filename, 'r', encoding='utf-8').read()

    if outfile:
        dirname = os.path.dirname(outfile)
        if dirname and not os.path.isdir(dirname):
            os.makedirs(dirname)

    try:
        model = genmodel(name, grammar, trace=trace, filename=filename)
        model.whitespace = whitespace
        model.nameguard = False if not nameguard else None  # None allows grammar specified or the default of True
        model.left_recursion = left_recursion

        if binary:
            result = pickle.dumps(model, protocol=2)
        elif pretty:
            result = str(model)
        else:
            result = codegen(model)

        if draw:
            from grako import diagrams
            diagrams.draw(outfile, model)
        elif outfile:
            with codecs.open(outfile, 'w', encoding='utf-8') as f:
                f.write(result)
        else:
            print(result)

        print('-' * 72, file=sys.stderr)
        print('{:12,d}  lines in grammar'.format(len(grammar.split())), file=sys.stderr)
        print('{:12,d}  rules in grammar'.format(len(model.rules)), file=sys.stderr)
        print('{:12,d}  nodes in AST'.format(model.nodecount()), file=sys.stderr)
    except GrakoException as e:
        _error(e)
        sys.exit(1)
Example #3
0
 def test_escape_sequences(self):
     self.assertEqual(u'\n', eval_escapes(r'\n'))
     self.assertEqual(u'this \xeds a test', eval_escapes(r'this \xeds a test'))
     self.assertEqual(u'this ís a test', eval_escapes(r'this \xeds a test'))
     self.assertEqual(u'\nañez', eval_escapes(r'\na\xf1ez'))
     self.assertEqual(u'\nañez', eval_escapes(r'\nañez'))