def compile(self, grammar): """ Produce an object capable of parsing via this grammar. @param grammar: A string containing an OMeta grammar. """ from pymeta.grammar_definition import OMetaGrammar, NullOptimizer g = OMetaGrammar(dedent(grammar)) tree = g.parseGrammar('TestGrammar', TreeBuilder) opt = NullOptimizer([tree]) opt.builder = TreeBuilder("TestGrammar", opt) tree, err = opt.apply("grammar") grammarClass = moduleFromGrammar(tree, 'TestGrammar', OMetaBase, {}) return HandyWrapper(grammarClass)
# Generates static grammar modules so the PyvaScript grammar doesn't need to be # parsed on first import. if __name__ == '__main__': import os, sys sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) from pymeta.builder import TreeBuilder, writeBoot from pymeta.grammar_definition import OMetaGrammar from pyvascript.grammar import grammar_path, translator_path for name, path in (('Grammar', grammar_path), ('Translator', translator_path)): with open(path, 'r') as fp: source = fp.read() grammar = OMetaGrammar(source) tree = grammar.parseGrammar('Generated' + name, TreeBuilder) path = os.path.join(os.path.dirname(__file__), name.lower() + '_generated.py') with open(path, 'w') as fp: fp.write('import json\ndef p(s): print(s)\n') fp.write(writeBoot(tree))
# Generates a boot grammar and stores it in boot_generated.py. If everything looks OK you can # replace your boot.py with the generated module. if __name__ == '__main__': import os, sys sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) from pymeta.builder import TreeBuilder, writeBoot from pymeta.grammar_definition import OMetaGrammar, ometaGrammar ometa_grammar = OMetaGrammar(ometaGrammar) tree = ometa_grammar.parseGrammar('BootOMetaGrammar', TreeBuilder) path = os.path.join(os.path.dirname(__file__), 'boot_generated.py') with open(path, 'w') as fp: fp.write(writeBoot(tree))