diff --git a/src/main/resources/org/sablecc/sablecc/parser.txt b/src/main/resources/org/sablecc/sablecc/parser.txt index 3fdb3b4473f7105782e8ad5b8382a8f005967e6e..35ff942e77020f761f33db8490048ad7a7ebbdd0 100644 --- a/src/main/resources/org/sablecc/sablecc/parser.txt +++ b/src/main/resources/org/sablecc/sablecc/parser.txt @@ -28,7 +28,7 @@ import $0$node.*; @SuppressWarnings({"rawtypes","unchecked","unused"}) public class Parser implements IParser { - protected List<Object> nodeList; + protected currentNode; private final Lexer lexer; private final Deque<State> stackA = new ArrayDeque<>(); @@ -55,7 +55,7 @@ public class Parser implements IParser @Override public Map<PositionedNode, SourcecodeRange> getMapping() { return this.mapping; } - private void checkResult(Object elementToCheck, List<Object> beginNodeList, List<Object> endNodeList) { + private void checkResult(Object elementToCheck, Object beginNodeList, Object endNodeList) { if (elementToCheck instanceof List<?>) { /* * special case: this is a list of nodes, for example an identifier @@ -75,7 +75,7 @@ public class Parser implements IParser final PositionedNode node = (PositionedNode) elementToCheck; if (!this.getMapping().containsKey(node)) { - PositionedNode beginNode = findBeginNode(beginNodeList); + PositionedNode beginNode = (PositionedNode) beginNodeList; final int begin; if (beginNode == null) { /* @@ -89,7 +89,7 @@ public class Parser implements IParser begin = findBeginPos(beginNode); } - PositionedNode endNode = findEndNode(endNodeList); + PositionedNode endNode = (PositionedNode)endNodeList; int end = findEndPos(endNode); if (end == -1) end = begin; final SourcecodeRange range = new SourcecodeRange(begin, end); @@ -101,20 +101,6 @@ public class Parser implements IParser } } - private PositionedNode findBeginNode(final List<Object> list) { - Object first = list.get(0); - if (first instanceof List<?>) { - List<?> list2 = (List<?>) first; - - if (list2.size() > 0) { - return (PositionedNode)list2.get(0); - } else { - return null; - } - } - - return (PositionedNode)first; - } private int findBeginPos(final PositionedNode node) { if (node instanceof IToken) { @@ -124,16 +110,6 @@ public class Parser implements IParser return this.getMapping().get(node).getBeginIndex(); } - private PositionedNode findEndNode(final List<Object> list) { - Object last = list.get(list.size() - 1); - if (last instanceof List<?>) { - final List<?> list2 = (List<?>) last; - return (PositionedNode)list2.get(list2.size() - 1); - } - - return (PositionedNode)last; - } - private int findEndPos(final PositionedNode node) { if (node instanceof IToken) { return findIndex((IToken) node); @@ -160,46 +136,55 @@ public class Parser implements IParser $ -Macro:ParserInliningPushHeader +Macro:ParserInliningPush - private void push(int numstate, List<Object> listNode) throws ParserException, LexerException, IOException - { - this.nodeList = listNode; + private void push(int numstate, Object node) throws ParserException, LexerException, IOException + { + this.currentNode = node; + if(stackB.isEmpty()) + { + stackA.push(new State(numstate, node)); + return; + } + State s = this.stack.next(); + s.state = numstate; + s.node = node; + } $ -Macro:ParserNoInliningPushHeader +Macro:ParserNoInliningPush protected void filter() throws ParserException, LexerException, IOException { // Empty body } - private void push(int numstate, List<Object> listNode, boolean hidden) throws ParserException, LexerException, IOException + private void push(int numstate, Object node, boolean hidden) throws ParserException, LexerException, IOException { - this.nodeList = listNode; + this.currentNode = node; if(!hidden) { filter(); } - -$ - -Macro:ParserCommon if(stackB.isEmpty()) { - stackA.push(new State(numstate, this.nodeList)); + stackA.push(new State(numstate, node)); return; } State s = stackB.pop(); stackA.push(s); s.state = numstate; - s.nodes = this.nodeList; + s.node = node; } +$ + +Macro:ParserCommon + private int goTo(int index) { int state = state(); @@ -235,11 +220,11 @@ Macro:ParserCommon } - private List<Object> pop() + private Object pop() { State s = stackA.pop(); stackB.push(s); - return s.nodes; + return s.node; } private int index(Switchable token) @@ -298,9 +283,7 @@ Macro:ParserCommon { case SHIFT: { - List<Object> list = new ArrayList<Object>(); - list.add(this.lexer.next()); - push(this.action[1], list$1$); + push(this.action[1], this.lexer.next()); } break; case REDUCE: @@ -352,20 +335,19 @@ Macro:ParserNewHeader - private List<Object> new$0$() /* reduce $1$ */ + private Object new$0$() /* reduce $1$ */ { - List<Object> nodeList = new ArrayList<>(); $ Macro:ParserNewBodyDecl - List<Object> nodeArrayList$0$ = pop(); + Object nodeArrayList$0$ = pop(); $ Macro:ParserNewBodyDeclNull - List<Object> nodeArrayList$0$ = null; + Object nodeArrayList$0$ = null; $ @@ -391,7 +373,7 @@ Macro:ParserListVariableDeclaration $ Macro:ParserSimpleTerm - $0$Node$1$ = ($2$)nodeArrayList$3$.get($4$); + $0$Node$1$ = ($2$)nodeArrayList$3$; $ @@ -424,22 +406,18 @@ $ Macro:ParserTypedLinkedListAddAll if($2$Node$3$ != null) { - if(!$0$Node$1$.isEmpty()){ - $0$Node$1$.addAll($2$Node$3$); - }else{ - $0$Node$1$ = $2$Node$3$; - } + $0$Node$1$ = $2$Node$3$; } $ Macro:ParserNewBodyListAdd - nodeList.add($0$Node$1$); + Object nodeList == $0$Node$1$; $ Macro:ParserNewCheck - checkResult(nodeList.get(0), nodeArrayList1, nodeArrayList$0$); + checkResult(nodeList, nodeArrayList1, nodeArrayList$0$); $ @@ -659,12 +637,12 @@ import java.util.List; final class State { int state; - List<Object> nodes; // elements are of type Node or List<Node> + Object node; - State(int state, List<Object> nodes) + State(int state, Object node) { this.state = state; - this.nodes = nodes; + this.node = node; } }