X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Ffleet%2Fassembler%2FParser.java;h=39deda3f56e48c27f5eda57c94abca4ec2599d2a;hb=a381e6cd5ce0d1e0debc61341dbb66620e802acb;hp=98fbed3188971f89623a921100123593b8d11143;hpb=48136174e089bb1650c0401cd885075a9fa243a1;p=fleet.git diff --git a/src/edu/berkeley/fleet/assembler/Parser.java b/src/edu/berkeley/fleet/assembler/Parser.java index 98fbed3..39deda3 100644 --- a/src/edu/berkeley/fleet/assembler/Parser.java +++ b/src/edu/berkeley/fleet/assembler/Parser.java @@ -36,15 +36,19 @@ public class Parser { return new CodeBag(name); } - Tree parse(Reader r) throws Exception { + private static Union grammar; + private static synchronized Union getGrammar() throws Exception { + if (grammar != null) return grammar; InputStream grammarStream = Parser.class.getClassLoader().getResourceAsStream("edu/berkeley/fleet/assembler/fleet.g"); CharParser metaGrammarParser = new CharParser(MetaGrammar.newInstance()); Tree parsedGrammar = metaGrammarParser.parse(new CharInput(grammarStream)).expand1(); - Union grammar = Grammar.create(parsedGrammar, "s", new Grammar.Bindings() { }); - CharParser parser = new CharParser(grammar); - Tree tree = parser.parse(new CharInput(r)).expand1(); - return tree; + grammar = Grammar.create(parsedGrammar, "s", new Grammar.Bindings() { public Object repeatTag() { return ""; } }); + return grammar; + } + + Tree parse(Reader r) throws Exception { + return new CharParser(getGrammar()).parse(new CharInput(r)).expand1(); } public void parse(Reader r, OutputStream out) throws Exception {