diff options
Diffstat (limited to 'cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java')
-rw-r--r-- | cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java | 73 |
1 files changed, 44 insertions, 29 deletions
diff --git a/cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java b/cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java index f827a8b..f3c93ac 100644 --- a/cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java +++ b/cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java @@ -1,12 +1,14 @@ package io.trygvis.ld; -import io.trygvis.ld.antlr.GnuLdBaseVisitor; import io.trygvis.ld.antlr.GnuLdLexer; import io.trygvis.ld.antlr.GnuLdParser; +import io.trygvis.ld.antlr.GnuLdParserBaseVisitor; import org.antlr.v4.runtime.ANTLRFileStream; import org.antlr.v4.runtime.BufferedTokenStream; +import org.antlr.v4.runtime.ConsoleErrorListener; import org.antlr.v4.runtime.tree.ParseTreeProperty; +import java.io.File; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashSet; @@ -15,6 +17,12 @@ import java.util.Set; public class LdScript { + public final List<MemoryArea> memoryAreas; + + public LdScript(List<MemoryArea> memoryAreas) { + this.memoryAreas = memoryAreas; + } + public enum MemoryAttribute { R, W, X, A, I, } @@ -76,39 +84,31 @@ public class LdScript { String name; } - public static void main(String[] args) throws Exception { - try { - work(args); - } catch (Exception e) { - e.printStackTrace(System.out); - } - } - - private static void work(String[] args) throws Exception { - args = new String[]{"lds/d2000.ld"}; + public static LdScript parse(File path) throws Exception { + GnuLdLexer lexer = new GnuLdLexer(new ANTLRFileStream(path.getAbsolutePath())); + BufferedTokenStream tokens = new BufferedTokenStream(lexer); + GnuLdParser parser = new GnuLdParser(tokens); + parser.setBuildParseTree(true); + parser.removeErrorListeners(); + ConsoleErrorListener errorListener = new ConsoleErrorListener(); + parser.addErrorListener(errorListener); + CollectingErrorListener collectingErrorListener = new CollectingErrorListener(); + parser.addErrorListener(collectingErrorListener); - GnuLdLexer lexer = new GnuLdLexer(new ANTLRFileStream(args[0])); - GnuLdParser parser = new GnuLdParser(new BufferedTokenStream(lexer)); + GnuLdParser.FileContext file = parser.file(); -// ElfInfoGnuLdBaseListener listener = new ElfInfoGnuLdBaseListener(); -// parser.addParseListener(listener); -// -// parser.file(); -// -// for (Section section : listener.sections) { -// System.out.println("section.name = " + section.name); -// } + if (parser.getNumberOfSyntaxErrors() > 0) { + throw new ParseErrorException(lexer, tokens, parser, collectingErrorListener.errors + ); + } ElfinfoGnuLdBaseVisitor visitor = new ElfinfoGnuLdBaseVisitor(); - visitor.visit(parser.file()); + visitor.visit(file); - System.out.println("--------------------------------------------------------"); - for (MemoryArea area : visitor.memoryAreas) { - System.out.println(" " + area.name + "(" + area.prettyAttributes() + ") : ORIGIN = " + area.prettyOrigin() + ", LENGTH=" + area.prettyLength()); - } + return new LdScript(visitor.memoryAreas); } - private static class ElfinfoExprGnuLdBaseVisitor extends GnuLdBaseVisitor<ElfinfoExprGnuLdBaseVisitor> { + private static class ElfinfoExprGnuLdBaseVisitor extends GnuLdParserBaseVisitor<ElfinfoExprGnuLdBaseVisitor> { private BigInteger value; private ParseTreeProperty<BigInteger> es = new ParseTreeProperty<>(); @@ -227,7 +227,7 @@ public class LdScript { } @Override - public ElfinfoExprGnuLdBaseVisitor visitExpAlign2(GnuLdParser.ExpAlign2Context ctx) { + public ElfinfoExprGnuLdBaseVisitor visitExpAlignK(GnuLdParser.ExpAlignKContext ctx) { return visitChildren(ctx); } @@ -416,7 +416,7 @@ public class LdScript { } } - private static class ElfinfoGnuLdBaseVisitor extends GnuLdBaseVisitor<ElfinfoGnuLdBaseVisitor> { + public static class ElfinfoGnuLdBaseVisitor extends GnuLdParserBaseVisitor<ElfinfoGnuLdBaseVisitor> { public List<MemoryArea> memoryAreas = new ArrayList<>(); public List<Section> sections = new ArrayList<>(); @@ -473,6 +473,7 @@ public class LdScript { if (!attributes.isEmpty()) { throw new RuntimeException("Attributes for memory areas can only be attributesInverted (with '!') as the first character in a specification; foo(!rw), not foo(x!rw)."); } +// String name = ctx.name().getText(); String name = ctx.NAME().getText(); System.out.println("ctx.ATTRIBUTE().getText() = " + name); @@ -480,4 +481,18 @@ public class LdScript { return visitChildren(ctx); } } + + public static class ParseErrorException extends Exception { + public final GnuLdLexer lexer; + public final BufferedTokenStream tokens; + public final GnuLdParser parser; + public final List<String> errors; + + public ParseErrorException(GnuLdLexer lexer, BufferedTokenStream tokens, GnuLdParser parser, List<String> errors) { + this.lexer = lexer; + this.tokens = tokens; + this.parser = parser; + this.errors = errors; + } + } } |