package parsing.C; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.misc.Interval; import parsing.FunctionParser; import parsing.C.Functions.ANTLRCFunctionParserDriver; import antlr.C.ModuleParser; import antlr.C.ModuleParser.Compound_statementContext; import antlr.C.ModuleParser.Function_defContext; import ast.statements.CompoundStatement; public class ModuleFunctionParserInterface { // Extracts compound statement from input stream // as a string and passes that string to the // function parser. The resulting 'CompoundStatement' // (an AST node) is returned. public static CompoundStatement parseFunctionContents( Function_defContext ctx) { String text = getCompoundStmtAsString(ctx); ANTLRCFunctionParserDriver driver = new ANTLRCFunctionParserDriver(); FunctionParser parser = new FunctionParser(driver); try { parser.parseAndWalkString(text); } catch (RuntimeException ex) { System.err.println("Error parsing function " + ctx.function_name().getText() + ". skipping."); // ex.printStackTrace(); } CompoundStatement result = parser.getResult(); result.initializeFromContext(ctx.compound_statement()); return result; } private static String getCompoundStmtAsString( ModuleParser.Function_defContext ctx) { Compound_statementContext compound_statement = ctx.compound_statement(); CharStream inputStream = compound_statement.start.getInputStream(); int startIndex = compound_statement.start.getStopIndex(); int stopIndex = compound_statement.stop.getStopIndex(); return inputStream.getText(new Interval(startIndex + 1, stopIndex - 1)); } }