package org.easyb.parser; import org.codehaus.groovy.antlr.parser.GroovyLexer; import org.codehaus.groovy.antlr.parser.GroovyRecognizer; import org.codehaus.groovy.antlr.UnicodeEscapingReader; import org.codehaus.groovy.antlr.SourceBuffer; import static org.easyb.parser.EasybSnippet.Coordinate.createCoordinate; import static org.easyb.parser.EasybSnippet.Coordinate.EOF; import java.io.Reader; import java.io.InputStreamReader; import java.util.List; import java.util.ArrayList; import groovyjarjarantlr.TokenStreamException; import groovyjarjarantlr.RecognitionException; import groovyjarjarantlr.collections.AST; public class EasybParser { private String specificationPath; /** * Construct an EasybParser * * @param specificationPath Path to search for specification on the classpath. Ex. "/abehavior.story". */ public EasybParser(String specificationPath) { this.specificationPath = specificationPath; } public List<EasybSnippet> splitBehaviors() throws TokenStreamException, RecognitionException { GroovyRecognizer parser = createParser(); parser.compilationUnit(); List<EasybSnippet> behaviors = new ArrayList<EasybSnippet>(); EasybSnippet.Coordinate lastCoordinate = createCoordinate(1, 1); AST ast = parser.getAST(); do { if (ast.getType() == GroovyLexer.EXPR) { EasybSnippet.Coordinate coordinate = createCoordinate(ast.getLine(), ast.getColumn()); behaviors.add(new EasybSnippet(specificationPath, lastCoordinate, coordinate)); lastCoordinate = coordinate; } ast = ast.getNextSibling(); } while (ast != null); behaviors.add(new EasybSnippet(specificationPath, lastCoordinate, EOF)); return behaviors; } private GroovyRecognizer createParser() { Reader reader = new InputStreamReader(getClass().getResourceAsStream(specificationPath)); GroovyLexer lexer = new GroovyLexer(new UnicodeEscapingReader(reader, new SourceBuffer())); return GroovyRecognizer.make(lexer); } }