diff --git a/src/main/java/org/sablecc/sablecc/parser/Parser.java b/src/main/java/org/sablecc/sablecc/parser/Parser.java index d2ad45a15624f7e4d66516c1e05bf7539f46ef95..201e9863d88ce9a696890d23d9b7aeb3c253ab19 100644 --- a/src/main/java/org/sablecc/sablecc/parser/Parser.java +++ b/src/main/java/org/sablecc/sablecc/parser/Parser.java @@ -61,65 +61,74 @@ public class Parser implements IParser final PositionedNode node = (PositionedNode) elementToCheck; if (!this.getMapping().containsKey(node)) { - final int begin = findBeginPos(beginNodeList, node); - int end = findEndPos(endNodeList); + PositionedNode beginNode = findBeginNode(beginNodeList); + final int begin; + if (beginNode == null) { + /* + * Sometimes (haven't found out why) we get empty list here. In + * the only observed cases we were looking for the source range + * of the whole parse unit. Then the index is 0. + */ + beginNode = (PositionedNode)this.lexer.getTokenList().get(0); + begin = 0; + } else { + begin = findBeginPos(beginNode); + } + + PositionedNode endNode = findEndNode(endNodeList); + int end = findEndPos(endNode); if (end == -1) end = begin; final SourcecodeRange range = new SourcecodeRange(begin, end); this.getMapping().put(node, range); - node.setStartPos(createBeginPos(begin)); - node.setEndPos(createEndPos(end)); + node.setStartPos(beginNode.getStartPos()); + node.setEndPos(endNode.getEndPos()); } } - - private int findBeginPos(final List<Object> list, - PositionedNode n) { + private PositionedNode findBeginNode(final List<Object> list) { Object first = list.get(0); - if (!(first instanceof PositionedNode) && !(first instanceof IToken)) { + if (first instanceof List<?>) { List<?> list2 = (List<?>) first; if (list2.size() > 0) { - first = list2.get(0); + return (PositionedNode)list2.get(0); } else { - /* - * Sometimes (haven't found out why) we get empty list here. In - * the only observed cases we were looking for the source range - * of the whole parse unit. Then the index is 0. - */ - return 0; + return null; } } - if (first instanceof IToken) { - return findIndex((IToken) first); - } + return (PositionedNode)first; + } - final PositionedNode node = (PositionedNode) first; - final SourcecodeRange item = this.getMapping().get(node); - if (item == null){ - System.err.println(n.getClass().getSimpleName() + " / " + node.getClass().getSimpleName() + ": " + node); + private int findBeginPos(final PositionedNode node) { + if (node instanceof IToken) { + return findIndex((IToken) node); } - return item.getBeginIndex(); - } + return this.getMapping().get(node).getBeginIndex(); + } - private int findEndPos(final List<Object> list) { + private PositionedNode findEndNode(final List<Object> list) { Object last = list.get(list.size() - 1); - if (!(last instanceof PositionedNode) && !(last instanceof IToken)) { + if (last instanceof List<?>) { final List<?> list2 = (List<?>) last; - last = list2.get(list2.size() - 1); + return (PositionedNode)list2.get(list2.size() - 1); } - if (last instanceof IToken) { - return findIndex((IToken) last); + return (PositionedNode)last; + } + + private int findEndPos(final PositionedNode node) { + if (node instanceof IToken) { + return findIndex((IToken) node); } - final PositionedNode node = (PositionedNode) last; final SourcecodeRange item = this.getMapping().get(node); - if (item == null) + if (item == null) { return -1; + } return item.getEndIndex(); } @@ -135,19 +144,6 @@ public class Parser implements IParser return -1; } - private SourcePosition createBeginPos(final int index) { - final List<IToken> list = this.lexer.getTokenList(); - final IToken token = list.get(index); - return new SourcePosition(token.getLine(), token.getPos()); - } - - private SourcePosition createEndPos(final int index) { - final List<IToken> list = this.lexer.getTokenList(); - final IToken token = list.get(index); - return new SourcePosition(token.getLine(), token.getPos() - + token.getText().length()); - } - /** * @deprecated Overriding this method no longer has any effect. This optimization is now applied automatically iff it is safe. */ diff --git a/src/main/resources/org/sablecc/sablecc/parser.txt b/src/main/resources/org/sablecc/sablecc/parser.txt index a843d3246e7260651c29f192a6be7864f533b8e7..9873f8314d2106b578395508002f0f6ce0d2eb44 100644 --- a/src/main/resources/org/sablecc/sablecc/parser.txt +++ b/src/main/resources/org/sablecc/sablecc/parser.txt @@ -69,65 +69,74 @@ public class Parser implements IParser final PositionedNode node = (PositionedNode) elementToCheck; if (!this.getMapping().containsKey(node)) { - final int begin = findBeginPos(beginNodeList, node); - int end = findEndPos(endNodeList); + PositionedNode beginNode = findBeginNode(beginNodeList); + final int begin; + if (beginNode == null) { + /* + * Sometimes (haven't found out why) we get empty list here. In + * the only observed cases we were looking for the source range + * of the whole parse unit. Then the index is 0. + */ + beginNode = (PositionedNode)this.lexer.getTokenList().get(0); + begin = 0; + } else { + begin = findBeginPos(beginNode); + } + + PositionedNode endNode = findEndNode(endNodeList); + int end = findEndPos(endNode); if (end == -1) end = begin; final SourcecodeRange range = new SourcecodeRange(begin, end); this.getMapping().put(node, range); - node.setStartPos(createBeginPos(begin)); - node.setEndPos(createEndPos(end)); + node.setStartPos(beginNode.getStartPos()); + node.setEndPos(endNode.getEndPos()); } } - - private int findBeginPos(final List<Object> list, - PositionedNode n) { + private PositionedNode findBeginNode(final List<Object> list) { Object first = list.get(0); - if (!(first instanceof PositionedNode) && !(first instanceof IToken)) { + if (first instanceof List<?>) { List<?> list2 = (List<?>) first; if (list2.size() > 0) { - first = list2.get(0); + return (PositionedNode)list2.get(0); } else { - /* - * Sometimes (haven't found out why) we get empty list here. In - * the only observed cases we were looking for the source range - * of the whole parse unit. Then the index is 0. - */ - return 0; + return null; } } - if (first instanceof IToken) { - return findIndex((IToken) first); - } + return (PositionedNode)first; + } - final PositionedNode node = (PositionedNode) first; - final SourcecodeRange item = this.getMapping().get(node); - if (item == null){ - System.err.println(n.getClass().getSimpleName() + " / " + node.getClass().getSimpleName() + ": " + node); + private int findBeginPos(final PositionedNode node) { + if (node instanceof IToken) { + return findIndex((IToken) node); } - return item.getBeginIndex(); - } + return this.getMapping().get(node).getBeginIndex(); + } - private int findEndPos(final List<Object> list) { + private PositionedNode findEndNode(final List<Object> list) { Object last = list.get(list.size() - 1); - if (!(last instanceof PositionedNode) && !(last instanceof IToken)) { + if (last instanceof List<?>) { final List<?> list2 = (List<?>) last; - last = list2.get(list2.size() - 1); + return (PositionedNode)list2.get(list2.size() - 1); } - if (last instanceof IToken) { - return findIndex((IToken) last); + return (PositionedNode)last; + } + + private int findEndPos(final PositionedNode node) { + if (node instanceof IToken) { + return findIndex((IToken) node); } - final PositionedNode node = (PositionedNode) last; final SourcecodeRange item = this.getMapping().get(node); - if (item == null) + if (item == null) { return -1; + } return item.getEndIndex(); } @@ -143,19 +152,6 @@ public class Parser implements IParser return -1; } - private SourcePosition createBeginPos(final int index) { - final List<IToken> list = this.lexer.getTokenList(); - final IToken token = list.get(index); - return new SourcePosition(token.getLine(), token.getPos()); - } - - private SourcePosition createEndPos(final int index) { - final List<IToken> list = this.lexer.getTokenList(); - final IToken token = list.get(index); - return new SourcePosition(token.getLine(), token.getPos() - + token.getText().length()); - } - /** * @deprecated Overriding this method no longer has any effect. This optimization is now applied automatically iff it is safe. */