From 8fa7179c6d4155bc263f03ac3fee204aac148d21 Mon Sep 17 00:00:00 2001 From: parrt Date: Sat, 8 May 2010 14:58:22 -0800 Subject: [PATCH] track AST nodes -> NFA now and add more code gen [git-p4: depot-paths = "//depot/code/antlr4/main/": change = 6846] --- .../v4/tool/templates/codegen/Java/Java.stg | 14 +++++ .../antlr/v4/automata/ParserNFAFactory.java | 63 +++++++++++-------- .../org/antlr/v4/codegen/CodeGenerator.java | 10 +-- .../org/antlr/v4/codegen/ParserGenerator.java | 7 ++- .../org/antlr/v4/codegen/SourceGenTriggers.g | 62 ++++++++++-------- tool/src/org/antlr/v4/codegen/src/Choice.java | 9 +-- .../org/antlr/v4/codegen/src/CodeBlock.java | 13 ++++ .../org/antlr/v4/codegen/src/InvokeRule.java | 7 ++- .../org/antlr/v4/codegen/src/LL1Choice.java | 12 ++++ .../v4/codegen/src/LL1OptionalBlock.java | 8 ++- .../src/LL1OptionalBlockSingleAlt.java | 8 ++- .../v4/codegen/src/LLStarOptionalBlock.java | 8 ++- .../v4/codegen/src/LLkOptionalBlock.java | 8 ++- .../org/antlr/v4/codegen/src/MatchToken.java | 6 ++ .../antlr/v4/codegen/src/OptionalBlock.java | 6 +- .../v4/codegen/src/OutputModelObject.java | 4 +- tool/src/org/antlr/v4/codegen/src/Parser.java | 11 ++-- .../org/antlr/v4/codegen/src/ParserFile.java | 9 ++- .../antlr/v4/codegen/src/RuleFunction.java | 8 ++- tool/src/org/antlr/v4/codegen/src/SrcOp.java | 2 +- tool/src/org/antlr/v4/tool/GrammarAST.java | 4 ++ 21 files changed, 186 insertions(+), 93 deletions(-) create mode 100644 tool/src/org/antlr/v4/codegen/src/LL1Choice.java diff --git a/tool/resources/org/antlr/v4/tool/templates/codegen/Java/Java.stg b/tool/resources/org/antlr/v4/tool/templates/codegen/Java/Java.stg index 4d785fea5..4b22f7e10 100644 --- a/tool/resources/org/antlr/v4/tool/templates/codegen/Java/Java.stg +++ b/tool/resources/org/antlr/v4/tool/templates/codegen/Java/Java.stg @@ -23,6 +23,20 @@ parserFunction(f,code) ::= << } >> +codeBlock(c, ops) ::= << + +>> + +switch(c, alts) ::= << +switch ( input.LA(1) ) { + +} +>> + +matchToken(m) ::= << +match(); +>> + codeFileExtension() ::= ".java" true() ::= "true" diff --git a/tool/src/org/antlr/v4/automata/ParserNFAFactory.java b/tool/src/org/antlr/v4/automata/ParserNFAFactory.java index b90880b76..bcf9922c5 100644 --- a/tool/src/org/antlr/v4/automata/ParserNFAFactory.java +++ b/tool/src/org/antlr/v4/automata/ParserNFAFactory.java @@ -65,34 +65,10 @@ public class ParserNFAFactory implements NFAFactory { Handle h = new Handle(start, stop); // FASerializer ser = new FASerializer(g, h.left); // System.out.println(ruleAST.toStringTree()+":\n"+ser); + ruleAST.nfaState = start; return h; } - public NFAState newState(Class nodeType, GrammarAST node) { - try { - Constructor ctor = nodeType.getConstructor(NFA.class); - NFAState s = (NFAState)ctor.newInstance(nfa); - s.ast = node; - s.rule = currentRule; - nfa.addState(s); - return s; - } - catch (Exception e) { - ErrorManager.internalError("can't create NFA node: "+nodeType.getName(), e); - } - return null; - } - - public BasicState newState(GrammarAST node) { - BasicState n = new BasicState(nfa); - n.rule = currentRule; - n.ast = node; - nfa.addState(n); - return n; - } - - public BasicState newState() { return newState(null); } - /** From label A build Graph o-A->o */ public Handle tokenRef(TerminalAST node) { BasicState left = newState(node); @@ -100,7 +76,7 @@ public class ParserNFAFactory implements NFAFactory { int ttype = g.getTokenType(node.getText()); left.transition = new AtomTransition(ttype, right); right.incidentTransition = left.transition; - + node.nfaState = left; return new Handle(left, right); } @@ -112,7 +88,7 @@ public class ParserNFAFactory implements NFAFactory { BasicState right = newState(associatedAST); left.transition = new SetTransition(set, right); right.incidentTransition = left.transition; - + associatedAST.nfaState = left; return new Handle(left, right); } @@ -168,6 +144,7 @@ public class ParserNFAFactory implements NFAFactory { RuleStopState stop = nfa.ruleToStopState.get(r); epsilon(stop, right); + node.nfaState = left; return new Handle(left, right); } @@ -176,6 +153,7 @@ public class ParserNFAFactory implements NFAFactory { BasicState left = newState(node); BasicState right = newState(node); epsilon(left, right); + node.nfaState = left; return new Handle(left, right); } @@ -188,6 +166,7 @@ public class ParserNFAFactory implements NFAFactory { BasicState left = newState(pred); NFAState right = newState(pred); left.transition = new PredicateTransition(pred, right); + pred.nfaState = left; return new Handle(left, right); } @@ -205,6 +184,7 @@ public class ParserNFAFactory implements NFAFactory { BasicState left = newState(action); NFAState right = newState(action); left.transition = new ActionTransition(action, right); + action.nfaState = left; return new Handle(left, right); } @@ -248,6 +228,7 @@ public class ParserNFAFactory implements NFAFactory { Handle h = new Handle(start, end); // FASerializer ser = new FASerializer(g, h.left); // System.out.println(blkAST.toStringTree()+":\n"+ser); + blkAST.nfaState = start; return h; } @@ -293,6 +274,7 @@ public class ParserNFAFactory implements NFAFactory { Handle h = new Handle(start, end); // FASerializer ser = new FASerializer(g, h.left); // System.out.println(optAST.toStringTree()+":\n"+ser); + optAST.nfaState = start; return h; } @@ -315,6 +297,7 @@ public class ParserNFAFactory implements NFAFactory { epsilon(blk.right, loop); epsilon(loop, end); nfa.defineDecisionState(loop); + plusAST.nfaState = start; return new Handle(start, end); } @@ -351,6 +334,7 @@ public class ParserNFAFactory implements NFAFactory { epsilon(loop, end); nfa.defineDecisionState(start); nfa.defineDecisionState(loop); + starAST.nfaState = start; return new Handle(start, end); } @@ -404,4 +388,29 @@ public class ParserNFAFactory implements NFAFactory { } return n; } + + public NFAState newState(Class nodeType, GrammarAST node) { + try { + Constructor ctor = nodeType.getConstructor(NFA.class); + NFAState s = (NFAState)ctor.newInstance(nfa); + s.ast = node; + s.rule = currentRule; + nfa.addState(s); + return s; + } + catch (Exception e) { + ErrorManager.internalError("can't create NFA node: "+nodeType.getName(), e); + } + return null; + } + + public BasicState newState(GrammarAST node) { + BasicState n = new BasicState(nfa); + n.rule = currentRule; + n.ast = node; + nfa.addState(n); + return n; + } + + public BasicState newState() { return newState(null); } } diff --git a/tool/src/org/antlr/v4/codegen/CodeGenerator.java b/tool/src/org/antlr/v4/codegen/CodeGenerator.java index f46f66c72..2ac163b70 100644 --- a/tool/src/org/antlr/v4/codegen/CodeGenerator.java +++ b/tool/src/org/antlr/v4/codegen/CodeGenerator.java @@ -12,15 +12,15 @@ import java.io.Writer; public abstract class CodeGenerator { public static final String TEMPLATE_ROOT = "org/antlr/v4/tool/templates/codegen"; public static final String VOCAB_FILE_EXTENSION = ".tokens"; - protected final static String vocabFilePattern = + public final static String vocabFilePattern = "=\n}>" + "=\n}>"; - Grammar g; - Target target; - STGroup templates; + public Grammar g; + public Target target; + public STGroup templates; - int lineWidth = 72; + public int lineWidth = 72; public CodeGenerator(Grammar g) { this.g = g; diff --git a/tool/src/org/antlr/v4/codegen/ParserGenerator.java b/tool/src/org/antlr/v4/codegen/ParserGenerator.java index 7884be0e4..8410f81c1 100644 --- a/tool/src/org/antlr/v4/codegen/ParserGenerator.java +++ b/tool/src/org/antlr/v4/codegen/ParserGenerator.java @@ -14,6 +14,9 @@ public class ParserGenerator extends CodeGenerator { put(Parser.class, "parser"); put(RuleFunction.class, "parserFunction"); put(DFADef.class, "DFA"); + put(CodeBlock.class, "codeBlock"); + put(LL1Choice.class, "switch"); + put(MatchToken.class, "matchToken"); }}; public ParserGenerator(Grammar g) { @@ -21,7 +24,7 @@ public class ParserGenerator extends CodeGenerator { } public OutputModelObject buildOutputModel() { - Parser p = new Parser(g); - return new ParserFile(p, getRecognizerFileName()); + Parser p = new Parser(this); + return new ParserFile(this, p, getRecognizerFileName()); } } diff --git a/tool/src/org/antlr/v4/codegen/SourceGenTriggers.g b/tool/src/org/antlr/v4/codegen/SourceGenTriggers.g index 69b092e99..dfaa9a3b7 100644 --- a/tool/src/org/antlr/v4/codegen/SourceGenTriggers.g +++ b/tool/src/org/antlr/v4/codegen/SourceGenTriggers.g @@ -8,31 +8,43 @@ options { @header { package org.antlr.v4.codegen; -import org.antlr.v4.codegen.nfa.*; -import org.antlr.v4.tool.GrammarAST; -import org.antlr.v4.tool.GrammarASTWithOptions; -import org.antlr.v4.tool.LexerGrammar; +import org.antlr.v4.codegen.src.*; +import org.antlr.v4.tool.*; import java.util.Collections; import java.util.Map; import java.util.HashMap; } -block +@members { +// TODO: identical grammar to NFABytecodeTriggers; would be nice to combine + public CodeGenerator gen; + public SourceGenTriggers(TreeNodeStream input, CodeGenerator gen) { + this(input); + this.gen = gen; + } +} + +block returns [CodeBlock omo] : ^( BLOCK (^(OPTIONS .+))? - ( alternative - )+ + {List alts = new ArrayList();} + ( alternative {alts.add($alternative.omo);} )+ ) + { + Choice c = new LL1Choice(gen, alts); // TODO: assumes LL1 + $omo = new CodeBlock(gen, c); + } ; -alternative +alternative returns [CodeBlock omo] +@init {List elems = new ArrayList();} : ^(ALT_REWRITE a=alternative .) - | ^(ALT EPSILON) - | ^(ALT (e=element )+) + | ^(ALT EPSILON) {$omo = new CodeBlock(gen);} + | ^( ALT ( element {elems.add($element.omo);} )+ ) {$omo = new CodeBlock(gen, elems);} ; -element +element returns [SrcOp omo] : labeledElement - | atom + | atom {$omo = $atom.omo;} | ebnf | ACTION | SEMPRED @@ -40,22 +52,18 @@ element | treeSpec ; -labeledElement +labeledElement returns [SrcOp omo] : ^(ASSIGN ID atom ) | ^(ASSIGN ID block) | ^(PLUS_ASSIGN ID atom) | ^(PLUS_ASSIGN ID block) ; -treeSpec +treeSpec returns [SrcOp omo] : ^(TREE_BEGIN (e=element )+) ; -ebnf -@init { - GrammarASTWithOptions blk = (GrammarASTWithOptions)$start.getChild(0); - String greedyOption = blk.getOption("greedy"); -} +ebnf returns [SrcOp omo] : ^(astBlockSuffix block) | ^(OPTIONAL block) @@ -72,7 +80,7 @@ astBlockSuffix | BANG ; -atom +atom returns [SrcOp omo] : ^(ROOT range) | ^(BANG range) | ^(ROOT notSet) @@ -83,32 +91,32 @@ atom | ^(DOT ID ruleref) | ^(WILDCARD .) | WILDCARD - | terminal - | ruleref + | terminal {$omo = $terminal.omo;} + | ruleref {$omo = $ruleref.omo;} ; -notSet +notSet returns [SrcOp omo] : ^(NOT terminal) | ^(NOT block) ; -ruleref +ruleref returns [SrcOp omo] : ^(ROOT ^(RULE_REF ARG_ACTION?)) | ^(BANG ^(RULE_REF ARG_ACTION?)) | ^(RULE_REF ARG_ACTION?) ; -range +range returns [SrcOp omo] : ^(RANGE a=STRING_LITERAL b=STRING_LITERAL) ; -terminal +terminal returns [MatchToken omo] : ^(STRING_LITERAL .) | STRING_LITERAL | ^(TOKEN_REF ARG_ACTION .) | ^(TOKEN_REF .) - | TOKEN_REF + | TOKEN_REF {$omo = new MatchToken(gen, (TerminalAST)$TOKEN_REF);} | ^(ROOT terminal) | ^(BANG terminal) ; diff --git a/tool/src/org/antlr/v4/codegen/src/Choice.java b/tool/src/org/antlr/v4/codegen/src/Choice.java index af0acd690..2c4c39865 100644 --- a/tool/src/org/antlr/v4/codegen/src/Choice.java +++ b/tool/src/org/antlr/v4/codegen/src/Choice.java @@ -1,17 +1,18 @@ package org.antlr.v4.codegen.src; -import org.antlr.v4.tool.Alternative; +import org.antlr.v4.codegen.CodeGenerator; import java.util.ArrayList; import java.util.List; /** */ -public class Choice extends SrcOp { +public abstract class Choice extends SrcOp { public DFADef dfaDef; public List alts; - public Choice(Alternative[] alts) { - + public Choice(CodeGenerator gen, List alts) { + this.gen = gen; + this.alts = alts; } @Override diff --git a/tool/src/org/antlr/v4/codegen/src/CodeBlock.java b/tool/src/org/antlr/v4/codegen/src/CodeBlock.java index 4576b9d40..f3a67977a 100644 --- a/tool/src/org/antlr/v4/codegen/src/CodeBlock.java +++ b/tool/src/org/antlr/v4/codegen/src/CodeBlock.java @@ -1,5 +1,7 @@ package org.antlr.v4.codegen.src; +import org.antlr.v4.codegen.CodeGenerator; + import java.util.ArrayList; import java.util.List; @@ -7,6 +9,17 @@ import java.util.List; public class CodeBlock extends SrcOp { public List ops; + public CodeBlock(CodeGenerator gen) { this.gen = gen; } + + public CodeBlock(CodeGenerator gen, List ops) { + this.gen = gen; + this.ops = ops; + } + + public CodeBlock(CodeGenerator gen, final SrcOp elem) { + this(gen, new ArrayList() {{ add(elem); }}); + } + @Override public List getChildren() { return new ArrayList() {{ add("ops"); }}; diff --git a/tool/src/org/antlr/v4/codegen/src/InvokeRule.java b/tool/src/org/antlr/v4/codegen/src/InvokeRule.java index 289b2fe97..c09886ed4 100644 --- a/tool/src/org/antlr/v4/codegen/src/InvokeRule.java +++ b/tool/src/org/antlr/v4/codegen/src/InvokeRule.java @@ -1,5 +1,6 @@ package org.antlr.v4.codegen.src; +import org.antlr.v4.codegen.CodeGenerator; import org.antlr.v4.misc.IntervalSet; import java.util.List; @@ -11,12 +12,14 @@ public class InvokeRule extends SrcOp { public List args; public IntervalSet[] follow; - public InvokeRule(String name, String argAction, IntervalSet[] follow) { + public InvokeRule(CodeGenerator gen, String name, String argAction, IntervalSet[] follow) { + this.gen = gen; // split and translate argAction // compute follow } - public InvokeRule(String name, IntervalSet[] follow) { + public InvokeRule(CodeGenerator gen, String name, IntervalSet[] follow) { + this.gen = gen; // split and translate argAction // compute follow } diff --git a/tool/src/org/antlr/v4/codegen/src/LL1Choice.java b/tool/src/org/antlr/v4/codegen/src/LL1Choice.java new file mode 100644 index 000000000..5015da5b0 --- /dev/null +++ b/tool/src/org/antlr/v4/codegen/src/LL1Choice.java @@ -0,0 +1,12 @@ +package org.antlr.v4.codegen.src; + +import org.antlr.v4.codegen.CodeGenerator; + +import java.util.List; + +/** */ +public class LL1Choice extends Choice { + public LL1Choice(CodeGenerator gen, List alts) { + super(gen, alts); + } +} diff --git a/tool/src/org/antlr/v4/codegen/src/LL1OptionalBlock.java b/tool/src/org/antlr/v4/codegen/src/LL1OptionalBlock.java index 90ce8c7ae..05eb39615 100644 --- a/tool/src/org/antlr/v4/codegen/src/LL1OptionalBlock.java +++ b/tool/src/org/antlr/v4/codegen/src/LL1OptionalBlock.java @@ -1,10 +1,12 @@ package org.antlr.v4.codegen.src; -import org.antlr.v4.tool.Alternative; +import org.antlr.v4.codegen.CodeGenerator; + +import java.util.List; /** */ public class LL1OptionalBlock extends OptionalBlock { - public LL1OptionalBlock(Alternative[] alts) { - super(alts); + public LL1OptionalBlock(CodeGenerator gen, List alts) { + super(gen, alts); } } diff --git a/tool/src/org/antlr/v4/codegen/src/LL1OptionalBlockSingleAlt.java b/tool/src/org/antlr/v4/codegen/src/LL1OptionalBlockSingleAlt.java index dfce66a4d..2ae83d963 100644 --- a/tool/src/org/antlr/v4/codegen/src/LL1OptionalBlockSingleAlt.java +++ b/tool/src/org/antlr/v4/codegen/src/LL1OptionalBlockSingleAlt.java @@ -1,10 +1,12 @@ package org.antlr.v4.codegen.src; -import org.antlr.v4.tool.Alternative; +import org.antlr.v4.codegen.CodeGenerator; + +import java.util.List; /** */ public class LL1OptionalBlockSingleAlt extends OptionalBlock { - public LL1OptionalBlockSingleAlt(Alternative[] alts) { - super(alts); + public LL1OptionalBlockSingleAlt(CodeGenerator gen, List alts) { + super(gen, alts); } } diff --git a/tool/src/org/antlr/v4/codegen/src/LLStarOptionalBlock.java b/tool/src/org/antlr/v4/codegen/src/LLStarOptionalBlock.java index 093475eff..1c991c4bc 100644 --- a/tool/src/org/antlr/v4/codegen/src/LLStarOptionalBlock.java +++ b/tool/src/org/antlr/v4/codegen/src/LLStarOptionalBlock.java @@ -1,10 +1,12 @@ package org.antlr.v4.codegen.src; -import org.antlr.v4.tool.Alternative; +import org.antlr.v4.codegen.CodeGenerator; + +import java.util.List; /** */ public class LLStarOptionalBlock extends OptionalBlock { - public LLStarOptionalBlock(Alternative[] alts) { - super(alts); + public LLStarOptionalBlock(CodeGenerator gen, List alts) { + super(gen, alts); } } diff --git a/tool/src/org/antlr/v4/codegen/src/LLkOptionalBlock.java b/tool/src/org/antlr/v4/codegen/src/LLkOptionalBlock.java index 84e6ce919..603c8821d 100644 --- a/tool/src/org/antlr/v4/codegen/src/LLkOptionalBlock.java +++ b/tool/src/org/antlr/v4/codegen/src/LLkOptionalBlock.java @@ -1,10 +1,12 @@ package org.antlr.v4.codegen.src; -import org.antlr.v4.tool.Alternative; +import org.antlr.v4.codegen.CodeGenerator; + +import java.util.List; /** */ public class LLkOptionalBlock extends OptionalBlock { - public LLkOptionalBlock(Alternative[] alts) { - super(alts); + public LLkOptionalBlock(CodeGenerator gen, List alts) { + super(gen, alts); } } diff --git a/tool/src/org/antlr/v4/codegen/src/MatchToken.java b/tool/src/org/antlr/v4/codegen/src/MatchToken.java index 11e921438..5ea1f8b97 100644 --- a/tool/src/org/antlr/v4/codegen/src/MatchToken.java +++ b/tool/src/org/antlr/v4/codegen/src/MatchToken.java @@ -1,9 +1,15 @@ package org.antlr.v4.codegen.src; +import org.antlr.v4.codegen.CodeGenerator; import org.antlr.v4.misc.IntervalSet; +import org.antlr.v4.tool.TerminalAST; /** */ public class MatchToken extends SrcOp { public int ttype; public IntervalSet[] follow; + + public MatchToken(CodeGenerator gen, TerminalAST ast) { + this.gen = gen; + } } diff --git a/tool/src/org/antlr/v4/codegen/src/OptionalBlock.java b/tool/src/org/antlr/v4/codegen/src/OptionalBlock.java index 3ce0063a7..b478e3044 100644 --- a/tool/src/org/antlr/v4/codegen/src/OptionalBlock.java +++ b/tool/src/org/antlr/v4/codegen/src/OptionalBlock.java @@ -1,13 +1,13 @@ package org.antlr.v4.codegen.src; -import org.antlr.v4.tool.Alternative; +import org.antlr.v4.codegen.CodeGenerator; import java.util.List; /** */ public class OptionalBlock extends Choice { - public OptionalBlock(Alternative[] alts) { - super(alts); + public OptionalBlock(CodeGenerator gen, List alts) { + super(gen, alts); } @Override diff --git a/tool/src/org/antlr/v4/codegen/src/OutputModelObject.java b/tool/src/org/antlr/v4/codegen/src/OutputModelObject.java index c12cafedc..49bb21311 100644 --- a/tool/src/org/antlr/v4/codegen/src/OutputModelObject.java +++ b/tool/src/org/antlr/v4/codegen/src/OutputModelObject.java @@ -1,10 +1,12 @@ package org.antlr.v4.codegen.src; +import org.antlr.v4.codegen.CodeGenerator; + import java.util.List; /** */ public abstract class OutputModelObject { - //public ST st; + public CodeGenerator gen; /** If the output model object encloses some other model objects, * we need to be able to walk them. Rather than make each class diff --git a/tool/src/org/antlr/v4/codegen/src/Parser.java b/tool/src/org/antlr/v4/codegen/src/Parser.java index 99ec0e745..284503810 100644 --- a/tool/src/org/antlr/v4/codegen/src/Parser.java +++ b/tool/src/org/antlr/v4/codegen/src/Parser.java @@ -1,8 +1,8 @@ package org.antlr.v4.codegen.src; import org.antlr.v4.automata.DFA; +import org.antlr.v4.codegen.CodeGenerator; import org.antlr.v4.misc.IntSet; -import org.antlr.v4.tool.Grammar; import org.antlr.v4.tool.Rule; import java.util.ArrayList; @@ -15,12 +15,13 @@ public class Parser extends OutputModelObject { public List dfaDefs = new ArrayList(); public List bitsetDefs; - public Parser(Grammar g) { - name = g.getRecognizerName(); - for (Rule r : g.rules.values()) funcs.add( new RuleFunction(r) ); + public Parser(CodeGenerator gen) { + this.gen = gen; + name = gen.g.getRecognizerName(); + for (Rule r : gen.g.rules.values()) funcs.add( new RuleFunction(gen, r) ); // build DFA, bitset defs - for (DFA dfa : g.decisionDFAs.values()) { + for (DFA dfa : gen.g.decisionDFAs.values()) { dfaDefs.add( new DFADef("DFA"+dfa.decision, dfa) ); } } diff --git a/tool/src/org/antlr/v4/codegen/src/ParserFile.java b/tool/src/org/antlr/v4/codegen/src/ParserFile.java index bfbc4be62..822c5625d 100644 --- a/tool/src/org/antlr/v4/codegen/src/ParserFile.java +++ b/tool/src/org/antlr/v4/codegen/src/ParserFile.java @@ -1,5 +1,7 @@ package org.antlr.v4.codegen.src; +import org.antlr.v4.codegen.CodeGenerator; + import java.util.ArrayList; import java.util.List; @@ -7,7 +9,12 @@ import java.util.List; public class ParserFile extends OutputModelObject { public String fileName; public Parser parser; - public ParserFile(Parser p, String fileName) { parser = p; this.fileName = fileName; } + + public ParserFile(CodeGenerator gen, Parser p, String fileName) { + this.gen = gen; + parser = p; + this.fileName = fileName; + } @Override public List getChildren() { diff --git a/tool/src/org/antlr/v4/codegen/src/RuleFunction.java b/tool/src/org/antlr/v4/codegen/src/RuleFunction.java index 40fd47156..378b1939e 100644 --- a/tool/src/org/antlr/v4/codegen/src/RuleFunction.java +++ b/tool/src/org/antlr/v4/codegen/src/RuleFunction.java @@ -1,6 +1,7 @@ package org.antlr.v4.codegen.src; import org.antlr.runtime.tree.CommonTreeNodeStream; +import org.antlr.v4.codegen.CodeGenerator; import org.antlr.v4.codegen.SourceGenTriggers; import org.antlr.v4.misc.Utils; import org.antlr.v4.parse.ANTLRParser; @@ -29,7 +30,8 @@ public class RuleFunction extends OutputModelObject { public CodeBlock code; - public RuleFunction(Rule r) { + public RuleFunction(CodeGenerator gen, Rule r) { + this.gen = gen; this.name = r.name; if ( r.modifiers!=null && r.modifiers.size()>0 ) { this.modifiers = new ArrayList(); @@ -48,9 +50,9 @@ public class RuleFunction extends OutputModelObject { GrammarASTAdaptor adaptor = new GrammarASTAdaptor(r.ast.token.getInputStream()); GrammarAST blk = (GrammarAST)r.ast.getFirstChildWithType(ANTLRParser.BLOCK); CommonTreeNodeStream nodes = new CommonTreeNodeStream(adaptor,blk); - SourceGenTriggers gen = new SourceGenTriggers(nodes); + SourceGenTriggers genTriggers = new SourceGenTriggers(nodes, gen); try { - gen.block(); // GEN Instr OBJECTS + code = genTriggers.block(); // GEN Instr OBJECTS } catch (Exception e){ e.printStackTrace(System.err); diff --git a/tool/src/org/antlr/v4/codegen/src/SrcOp.java b/tool/src/org/antlr/v4/codegen/src/SrcOp.java index 5f83d3b29..d218aec02 100644 --- a/tool/src/org/antlr/v4/codegen/src/SrcOp.java +++ b/tool/src/org/antlr/v4/codegen/src/SrcOp.java @@ -3,6 +3,6 @@ package org.antlr.v4.codegen.src; import org.antlr.v4.tool.GrammarAST; /** */ -public class SrcOp extends OutputModelObject { +public abstract class SrcOp extends OutputModelObject { public GrammarAST ast; } diff --git a/tool/src/org/antlr/v4/tool/GrammarAST.java b/tool/src/org/antlr/v4/tool/GrammarAST.java index 30f2c719d..660143b2d 100644 --- a/tool/src/org/antlr/v4/tool/GrammarAST.java +++ b/tool/src/org/antlr/v4/tool/GrammarAST.java @@ -4,6 +4,7 @@ import org.antlr.runtime.BitSet; import org.antlr.runtime.CommonToken; import org.antlr.runtime.Token; import org.antlr.runtime.tree.Tree; +import org.antlr.v4.automata.NFAState; import org.antlr.v4.parse.ANTLRParser; import org.antlr.v4.runtime.tree.CommonTree; @@ -12,6 +13,9 @@ import java.util.LinkedList; import java.util.List; public class GrammarAST extends CommonTree { + /** If we build an NFA, we make AST node point at left edge of NFA construct */ + public NFAState nfaState; + public GrammarAST() {;} public GrammarAST(Token t) { super(t); } public GrammarAST(GrammarAST node) { super(node); }