1 package org.simantics.scl.compiler.completions.parsing;
5 import java.util.concurrent.atomic.AtomicBoolean;
7 import org.simantics.scl.compiler.compilation.CompilationContext;
8 import org.simantics.scl.compiler.compilation.DeclarationClassification;
9 import org.simantics.scl.compiler.internal.parsing.declarations.DeclarationAst;
10 import org.simantics.scl.compiler.internal.parsing.parser.SCLParserImpl;
11 import org.simantics.scl.compiler.internal.parsing.parser.SCLParserOptions;
13 public class RobustModuleParser {
15 private static List<DeclarationAst> parseSegment(CompilationContext context, AtomicBoolean firstToken, Reader reader) {
16 SCLParserImpl parser = new SCLParserImpl(reader);
17 parser.getLexer().isFirstToken = firstToken.get();
18 parser.setCompilationContext(context);
19 parser.setParserOptions(SCLParserOptions.MODULE_DEFAULT);
20 List<DeclarationAst> result = (List<DeclarationAst>)parser.parseModule();
21 firstToken.set(parser.getLexer().isFirstToken);
25 public static DeclarationClassification parse(CompilationContext context, String sourceText) {
26 DeclarationClassification declarations = new DeclarationClassification(context);
27 AtomicBoolean firstToken = new AtomicBoolean(false);
28 for(ModuleSegment segment : RobustModuleSplitter.split(sourceText)) {
29 //System.out.println("----------------------------------------------------------");
30 //System.out.println(sourceText.substring(segment.begin, segment.end));
32 if(segment.hasErrors) {
33 System.out.println(" has errors");
34 // TODO we could try some special parsing here
37 Reader reader = new SubstringReader(sourceText, segment.begin, segment.end);
39 for(DeclarationAst declaration : parseSegment(context, firstToken, reader))
40 declarations.handle(declaration);
41 } catch(Exception e) {
43 //e.printStackTrace(System.out);