From a8631ae28c9f1fbe43ad747b3dd33337e4f8f41f Mon Sep 17 00:00:00 2001 From: jkohnlein Date: Tue, 21 Oct 2008 09:25:56 +0000 Subject: [PATCH] Make AntLR parser use AntlrTokenDefProvider. Bootstrapped. --- .../parser/antlr/AbstractAntlrParser.java | 48 ++++--------------- .../eclipse/xtext/parser/antlr/TokenTool.java | 11 +++++ 2 files changed, 19 insertions(+), 40 deletions(-) diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/antlr/AbstractAntlrParser.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/antlr/AbstractAntlrParser.java index e061a19e7..6fee10d15 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/antlr/AbstractAntlrParser.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/antlr/AbstractAntlrParser.java @@ -1,17 +1,13 @@ package org.eclipse.xtext.parser.antlr; -import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.util.Map.Entry; import org.antlr.runtime.BitSet; import org.antlr.runtime.IntStream; @@ -19,7 +15,6 @@ import org.antlr.runtime.Parser; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.Token; import org.antlr.runtime.TokenStream; -import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.common.util.WrappedException; @@ -44,8 +39,6 @@ import org.eclipse.xtext.util.Strings; public abstract class AbstractAntlrParser extends Parser { - private static Logger log = Logger.getLogger(AbstractAntlrParser.class); - protected CompositeNode currentNode; protected org.eclipse.xtext.Grammar grammar; @@ -113,43 +106,18 @@ public abstract class AbstractAntlrParser extends Parser { private Map antlrTypeToLexerName = null; - public Map getTokenTypeMap() { - if (antlrTypeToLexerName == null) { - InputStream tokenFile = getTokenFile(); - try { - BufferedReader br = new BufferedReader(new InputStreamReader(tokenFile)); - antlrTypeToLexerName = new HashMap(); - String line = br.readLine(); - Pattern pattern = Pattern.compile("(.*)=(\\d+)"); - while (line != null) { - Matcher m = pattern.matcher(line); - if (!m.matches()) { - throw new IllegalStateException("Couldn't match line : '" + line + "'"); - } - - String tokenTypeId = m.group(2); - String token = m.group(1); - String prefix = "RULE_"; - if (token.startsWith(prefix)) - antlrTypeToLexerName.put(Integer.parseInt(tokenTypeId), token.substring(prefix.length())); - line = br.readLine(); - } - } catch (IOException e) { - log.error(e); - throw new WrappedException(e); - } finally { - try { - tokenFile.close(); - } catch (IOException e) { - throw new WrappedException(e); - } + public void setTokenTypeMap(Map tokenTypeMap) { + antlrTypeToLexerName = new HashMap(); + for(Entry mapEntry: tokenTypeMap.entrySet()) { + String value = mapEntry.getValue(); + if(TokenTool.isLexerRule(value)) { + antlrTypeToLexerName.put(mapEntry.getKey(), TokenTool.getLexerRuleName(value)); } } - return antlrTypeToLexerName; } protected void setLexerRule(LeafNode leafNode, Token hidden) { - String ruleName = getTokenTypeMap().get(hidden.getType()); + String ruleName = antlrTypeToLexerName.get(hidden.getType()); AbstractRule rule = GrammarUtil.findRuleForName(grammar, ruleName); if (rule instanceof LexerRule) { leafNode.setGrammarElement(rule); diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/antlr/TokenTool.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/antlr/TokenTool.java index 281b562f2..09ce36b4c 100755 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/antlr/TokenTool.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/antlr/TokenTool.java @@ -51,4 +51,15 @@ public class TokenTool { String text = getText(t); return text!=null ? text.length() : 0; } + + public static final String LEXER_RULE_PREFIX = "RULE_"; + + public static boolean isLexerRule(String antlrTokenDef) { + return antlrTokenDef.startsWith(LEXER_RULE_PREFIX); + } + + public static String getLexerRuleName(String antlrTokenDef) { + return antlrTokenDef.substring(LEXER_RULE_PREFIX.length()); + } + }