X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fparsing%2Fparser%2FSCLPostLexer.java;h=96d3bbc06c67a2c71465742deab22cd893912c54;hp=efc799322b3d37c4220a90de6f8061154d3ace35;hb=3216affb4ed0e73a5601be223638f4f1a41fb26a;hpb=593a8f75d9dbc363234002dc500c346afbeba040 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLPostLexer.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLPostLexer.java index efc799322..96d3bbc06 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLPostLexer.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLPostLexer.java @@ -3,6 +3,7 @@ package org.simantics.scl.compiler.internal.parsing.parser; import java.io.IOException; import java.util.Arrays; +import org.simantics.scl.compiler.compilation.CompilationContext; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.parsing.Token; import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException; @@ -16,6 +17,9 @@ import gnu.trove.set.hash.TIntHashSet; * @author Hannu Niemistö */ public class SCLPostLexer { + + private static final int PATCH_SIZE = 16; + private static final int INITIAL_QUEUE_SIZE = 32; public static TIntHashSet INDENTABLE = new TIntHashSet(); public static TIntHashSet NO_SEMICOLON_BEFORE = new TIntHashSet(); @@ -26,6 +30,7 @@ public class SCLPostLexer { INDENTABLE.add(SCLTerminals.WITH); INDENTABLE.add(SCLTerminals.DO); INDENTABLE.add(SCLTerminals.MDO); + INDENTABLE.add(SCLTerminals.EDO); INDENTABLE.add(SCLTerminals.LET); INDENTABLE.add(SCLTerminals.ENFORCE); INDENTABLE.add(SCLTerminals.WHEN); @@ -49,7 +54,7 @@ public class SCLPostLexer { } SCLLexer lexer; - Token[] queue = new Token[16]; + Token[] queue = new Token[INITIAL_QUEUE_SIZE]; int queuePos=0, queueSize=0; TIntArrayList indentations = new TIntArrayList(); TIntArrayList indentationTokens = new TIntArrayList(); @@ -57,6 +62,13 @@ public class SCLPostLexer { int lineStart = 0; boolean firstTokenOfLine = true; private SCLParserOptions options; + public boolean isFirstToken = true; + private CompilationContext context; + + /** + * We are parsing a module header and therefore should process tokens one by one and not by patches. + */ + private boolean isInsideModule = false; { indentations.add(0); @@ -70,6 +82,11 @@ public class SCLPostLexer { public SCLPostLexer(java.io.Reader in) { this(new SCLLexer(in)); } + + public void setCompilationContext(CompilationContext context) { + lexer.setCompilationContext(context); + this.context = context; + } public Token nextToken() throws Exception { while(queuePos == queueSize) @@ -97,8 +114,15 @@ public class SCLPostLexer { queuePos = 0; queueSize = 0; - for(int i=0;i<8;++i) + for(int i=0;i