Skip to content

Commit

Permalink
[#201] as-8080, as-z80: fix includes
Browse files Browse the repository at this point in the history
  • Loading branch information
vbmacher committed Mar 15, 2022
1 parent b72fbe3 commit 108baac
Show file tree
Hide file tree
Showing 27 changed files with 92 additions and 17 deletions.
1 change: 1 addition & 0 deletions plugins/compiler/as-8080/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ plugins {
id 'java'
id 'idea'
id 'antlr'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,9 @@ public void reset(InputStream inputStream) throws IOException {
}

private int convertLexerTokenType(int tokenType) {
if (tokenType == EOF) {
return Token.EOF;
}
return tokenMap[tokenType];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;

import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.nio.file.Path;
import java.util.*;

import static net.emustudio.plugins.compiler.as8080.CompileError.couldNotReadFile;
import static net.emustudio.plugins.compiler.as8080.CompileError.infiniteLoopDetected;
Expand All @@ -21,7 +20,8 @@
* Integrate "include" files and remove PseudoInclude
*/
public class ExpandIncludesVisitor extends NodeVisitor {
private final Set<String> includedFiles; // TODO: windows platform case-insensitive!
private final Set<String> includedFiles;
private Optional<String> inputFileName = Optional.empty();

public ExpandIncludesVisitor() {
this.includedFiles = Collections.emptySet();
Expand All @@ -31,20 +31,28 @@ public ExpandIncludesVisitor(Set<String> includedFiles) {
this.includedFiles = Objects.requireNonNull(includedFiles);
}

@Override
public void visit(Program node) {
this.inputFileName = node.getFileName();
super.visit(node);
}

@Override
public void visit(PseudoInclude node) {
if (includedFiles.contains(node.filename)) {
fatalError(infiniteLoopDetected(node, "include"));
}

try {
As8080Lexer lexer = new As8080Lexer(CharStreams.fromFileName(node.filename));
String absoluteFileName = findAbsoluteFileName(node.filename);

As8080Lexer lexer = new As8080Lexer(CharStreams.fromFileName(absoluteFileName));
CommonTokenStream stream = new CommonTokenStream(lexer);
As8080Parser parser = new As8080Parser(stream);
stream.fill();
ParseTree tree = parser.rStart();
Program program = new Program(node.line, node.column, env);
program.setFileName(node.filename);
program.setFileName(absoluteFileName);

new CreateProgramVisitor(program).visit(tree);

Expand All @@ -58,4 +66,20 @@ public void visit(PseudoInclude node) {
error(couldNotReadFile(node, node.filename, e));
}
}

private String findAbsoluteFileName(String includeFileName) {
File includeFile = new File(includeFileName);
if (includeFile.isAbsolute()) {
return includeFileName;
}

return inputFileName
.map(f -> f.replace("\\", File.separator))
.map(File::new)
.map(File::getParentFile)
.map(File::toPath)
.map(p -> p.resolve(includeFileName))
.map(Path::toString)
.orElse(includeFileName);
}
}
1 change: 1 addition & 0 deletions plugins/compiler/as-ssem/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ plugins {
id 'java'
id 'idea'
id 'antlr'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/compiler/as-z80/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ plugins {
id 'java'
id 'idea'
id 'antlr'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ public boolean compile(String inputFileName, String outputFileName) {
parser.addErrorListener(new ParserErrorListener());

Program program = new Program();
program.setFileName(inputFileName);
new CreateProgramVisitor(program).visit(parser.rStart());

IntelHEX hex = new IntelHEX();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import net.emustudio.plugins.compiler.asZ80.CompileError;

import java.io.File;
import java.util.*;

public class NameSpace {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;

import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.nio.file.Path;
import java.util.*;

import static net.emustudio.plugins.compiler.asZ80.CompileError.couldNotReadFile;
import static net.emustudio.plugins.compiler.asZ80.CompileError.infiniteLoopDetected;
Expand All @@ -21,8 +20,9 @@
* Integrate "include" files and remove PseudoInclude
*/
public class ExpandIncludesVisitor extends NodeVisitor {
private final Set<String> includedFiles; // TODO: windows platform case-insensitive!

private final Set<String> includedFiles;
private Optional<String> inputFileName = Optional.empty();

public ExpandIncludesVisitor() {
this.includedFiles = Collections.emptySet();
}
Expand All @@ -31,20 +31,28 @@ public ExpandIncludesVisitor(Set<String> includedFiles) {
this.includedFiles = Objects.requireNonNull(includedFiles);
}

@Override
public void visit(Program node) {
this.inputFileName = node.getFileName();
super.visit(node);
}

@Override
public void visit(PseudoInclude node) {
if (includedFiles.contains(node.filename)) {
fatalError(infiniteLoopDetected(node, "include"));
}

try {
AsZ80Lexer lexer = new AsZ80Lexer(CharStreams.fromFileName(node.filename));
String absoluteFileName = findAbsoluteFileName(node.filename);

AsZ80Lexer lexer = new AsZ80Lexer(CharStreams.fromFileName(absoluteFileName));
CommonTokenStream stream = new CommonTokenStream(lexer);
AsZ80Parser parser = new AsZ80Parser(stream);
stream.fill();
ParseTree tree = parser.rStart();
Program program = new Program(node.line, node.column, env);
program.setFileName(node.filename);
program.setFileName(absoluteFileName);

new CreateProgramVisitor(program).visit(tree);

Expand All @@ -58,4 +66,20 @@ public void visit(PseudoInclude node) {
error(couldNotReadFile(node, node.filename, e));
}
}

private String findAbsoluteFileName(String includeFileName) {
File includeFile = new File(includeFileName);
if (includeFile.isAbsolute()) {
return includeFileName;
}

return inputFileName
.map(f -> f.replace("\\", File.separator))
.map(File::new)
.map(File::getParentFile)
.map(File::toPath)
.map(p -> p.resolve(includeFileName))
.map(Path::toString)
.orElse(includeFileName);
}
}
1 change: 1 addition & 0 deletions plugins/compiler/brainc-brainduck/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ plugins {
id 'java'
id 'org.xbib.gradle.plugin.jflex' version "1.5.0"
id "com.github.andrescv.jcup" version "1.0"
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/compiler/ramc-ram/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ plugins {
id 'java'
id 'org.xbib.gradle.plugin.jflex' version "1.5.0"
id "com.github.andrescv.jcup" version "1.0"
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/compiler/raspc-rasp/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ plugins {
id 'java'
id 'org.xbib.gradle.plugin.jflex' version "1.5.0"
id "com.github.andrescv.jcup" version "1.0"
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/cpu/brainduck-cpu/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import org.apache.tools.ant.filters.ReplaceTokens
plugins {
id 'java'
id 'net.emustudio.edigen-plugin' version '1.4.0'
id 'com.adarshr.test-logger' version '3.1.0'
}

repositories {
Expand Down
3 changes: 2 additions & 1 deletion plugins/cpu/ram-cpu/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

repositories {
mavenLocal()
mavenCentral()
jcenter()
}

dependencies {
Expand Down
3 changes: 2 additions & 1 deletion plugins/cpu/rasp-cpu/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

repositories {
mavenLocal()
mavenCentral()
jcenter()
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/cpu/ssem-cpu/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ buildscript {
plugins {
id 'java'
id 'net.emustudio.edigen-plugin' version '1.4.0'
id 'com.adarshr.test-logger' version '3.1.0'
}

repositories {
Expand Down
1 change: 1 addition & 0 deletions plugins/device/88-dcdd/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/device/88-sio/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/device/abstract-tape/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/device/adm3A-terminal/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/device/brainduck-terminal/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/device/simhPseudo-z80/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/device/ssem-display/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/memory/brainduck-mem/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/memory/byte-mem/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/memory/ram-mem/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/memory/rasp-mem/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down
1 change: 1 addition & 0 deletions plugins/memory/ssem-mem/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.apache.tools.ant.filters.ReplaceTokens

plugins {
id 'java'
id 'com.adarshr.test-logger' version '3.1.0'
}

dependencies {
Expand Down

0 comments on commit 108baac

Please sign in to comment.