package io.trygvis.ld; import io.trygvis.ld.antlr.GnuLdParser; import io.trygvis.ld.antlr.GnuLdParserBaseVisitor; import org.antlr.v4.runtime.tree.ParseTreeProperty; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class ElfinfoGnuLdVisitor extends GnuLdParserBaseVisitor { public List memoryAreas = new ArrayList<>(); ParseTreeProperty es = new ParseTreeProperty<>(); @Override public ElfinfoGnuLdVisitor visitMemory_spec(GnuLdParser.Memory_specContext ctx) { System.out.println("ElfinfoGnuLdBaseVisitor.visitMemory_spec"); visitChildren(ctx); if (attributesInverted) { // not quite sure how this is supposed to work yet throw new RuntimeException("Inverted memory region attributes is not implemented yet."); } LdLoader.MemoryArea ma = new LdLoader.MemoryArea(); ma.name = ctx.NAME().getText(); ma.attributes = attributes; ma.origin = ElfinfoExprVisitor.evaluate(ctx.origin_spec().mustbe_exp()); ma.length = ElfinfoExprVisitor.evaluate(ctx.length_spec().mustbe_exp()); System.out.println(ma); memoryAreas.add(ma); return this; } LdLoader.MemoryAttribute attribute; boolean attributesInverted; Set attributes; @Override public ElfinfoGnuLdVisitor visitAttributes_opt(GnuLdParser.Attributes_optContext ctx) { System.out.println("ElfinfoGnuLdBaseVisitor.visitAttributes_opt"); attributes = new HashSet<>(); return visitChildren(ctx); } @Override public ElfinfoGnuLdVisitor visitAttributeNormal(GnuLdParser.AttributeNormalContext ctx) { System.out.println("ElfinfoGnuLdBaseVisitor.visitAttributeNormal"); String name = ctx.NAME().getText(); System.out.println("ctx.ATTRIBUTE().getText() = " + name); for (int i = 0; i < name.length(); i++) { attribute = LdLoader.MemoryAttribute.valueOf(String.valueOf(Character.toUpperCase(name.charAt(i)))); attributes.add(attribute); } attributesInverted = false; return visitChildren(ctx); } @Override public ElfinfoGnuLdVisitor visitAttributeInverted(GnuLdParser.AttributeInvertedContext ctx) { System.out.println("ElfinfoGnuLdBaseVisitor.visitAttributeInverted"); 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); attributesInverted = true; return visitChildren(ctx); } }