Pratt cleanup: per-parser registry

This commit is contained in:
Roman Shevchenko
2012-05-08 20:43:05 +04:00
parent 2f19ecb272
commit 631e9611c8
3 changed files with 17 additions and 13 deletions
@@ -32,21 +32,23 @@ import java.util.List;
* @author peter
*/
public class PrattBuilderImpl extends PrattBuilder {
private final PrattBuilder myParentBuilder;
private final PsiBuilder myBuilder;
private final PrattBuilder myParentBuilder;
private final PrattRegistry myRegistry;
private final LinkedList<IElementType> myLeftSiblings = new LinkedList<IElementType>();
private boolean myParsingStarted;
private String myExpectedMessage;
private int myPriority = Integer.MIN_VALUE;
private MutableMarker myStartMarker;
private PrattBuilderImpl(final PsiBuilder builder, final PrattBuilder parent) {
private PrattBuilderImpl(final PsiBuilder builder, final PrattBuilder parent, final PrattRegistry registry) {
myBuilder = builder;
myParentBuilder = parent;
myRegistry = registry;
}
public static PrattBuilder createBuilder(final PsiBuilder builder) {
return new PrattBuilderImpl(builder, null);
public static PrattBuilder createBuilder(final PsiBuilder builder, final PrattRegistry registry) {
return new PrattBuilderImpl(builder, null, registry);
}
public PrattBuilder expecting(final String expectedMessage) {
@@ -79,7 +81,7 @@ public class PrattBuilderImpl extends PrattBuilder {
protected PrattBuilder createChildBuilder() {
assert myParsingStarted;
return new PrattBuilderImpl(myBuilder, this) {
return new PrattBuilderImpl(myBuilder, this, myRegistry) {
protected void doParse() {
super.doParse();
PrattBuilderImpl.this.myLeftSiblings.addAll(getResultTypes());
@@ -116,7 +118,7 @@ public class PrattBuilderImpl extends PrattBuilder {
@Nullable
private TokenParser findParser() {
final IElementType tokenType = getTokenType();
for (final Trinity<Integer, PathPattern, TokenParser> trinity : PrattRegistry.getParsers(tokenType)) {
for (final Trinity<Integer, PathPattern, TokenParser> trinity : myRegistry.getParsers(tokenType)) {
if (trinity.first > myPriority && trinity.second.accepts(this)) {
return trinity.third;
}
@@ -25,9 +25,11 @@ import org.jetbrains.annotations.NotNull;
* @author peter
*/
public abstract class PrattParser implements PsiParser {
protected abstract PrattRegistry getRegistry();
@NotNull
public final ASTNode parse(final IElementType root, final PsiBuilder builder) {
final PrattBuilder prattBuilder = PrattBuilderImpl.createBuilder(builder);
final PrattBuilder prattBuilder = PrattBuilderImpl.createBuilder(builder, getRegistry());
final MutableMarker marker = prattBuilder.mark();
parse(prattBuilder);
marker.finish(root);
@@ -27,18 +27,18 @@ import java.util.Collection;
* @author peter
*/
public class PrattRegistry {
private static final MultiMap<IElementType, Trinity<Integer, PathPattern, TokenParser>> ourMap = new MultiMap<IElementType, Trinity<Integer, PathPattern, TokenParser>>();
private final MultiMap<IElementType, Trinity<Integer, PathPattern, TokenParser>> myMap = new MultiMap<IElementType, Trinity<Integer, PathPattern, TokenParser>>();
public static void registerParser(@NotNull final IElementType type, final int priority, final TokenParser parser) {
public void registerParser(@NotNull final IElementType type, final int priority, final TokenParser parser) {
registerParser(type, priority, PathPattern.path(), parser);
}
public static void registerParser(@NotNull final IElementType type, final int priority, final PathPattern pattern, final TokenParser parser) {
ourMap.putValue(type, new Trinity<Integer, PathPattern, TokenParser>(priority, pattern, parser));
public void registerParser(@NotNull final IElementType type, final int priority, final PathPattern pattern, final TokenParser parser) {
myMap.putValue(type, new Trinity<Integer, PathPattern, TokenParser>(priority, pattern, parser));
}
@NotNull
public static Collection<Trinity<Integer, PathPattern, TokenParser>> getParsers(@Nullable final IElementType type) {
return ourMap.get(type);
public Collection<Trinity<Integer, PathPattern, TokenParser>> getParsers(@Nullable final IElementType type) {
return myMap.get(type);
}
}