From 85e2726ddedd2981425c5ac07f7257bce1a6ddbf Mon Sep 17 00:00:00 2001 From: jwansek Date: Mon, 1 Nov 2021 14:51:47 +0000 Subject: started work on translation to c --- code/FORTRAN2C/Makefile | 8 +++++++ code/FORTRAN2C/build/out.c | 6 ++++++ code/FORTRAN2C/examples/maths.txt | 1 + code/FORTRAN2C/examples/maths2.txt | 1 + code/FORTRAN2C/examples/maths3.txt | 1 + code/FORTRAN2C/examples/maths4.txt | 1 + code/FORTRAN2C/fortran2c.grammar | 35 +++++++++++++++++++++++++++++++ code/FORTRAN2C/fortran2c/CWriter.java | 26 +++++++++++++++++++++++ code/FORTRAN2C/fortran2c/Compiler.java | 28 +++++++++++++++++++++++++ code/FORTRAN2C/fortran2c/Translation.java | 13 ++++++++++++ 10 files changed, 120 insertions(+) create mode 100644 code/FORTRAN2C/Makefile create mode 100644 code/FORTRAN2C/build/out.c create mode 100644 code/FORTRAN2C/examples/maths.txt create mode 100644 code/FORTRAN2C/examples/maths2.txt create mode 100644 code/FORTRAN2C/examples/maths3.txt create mode 100644 code/FORTRAN2C/examples/maths4.txt create mode 100644 code/FORTRAN2C/fortran2c.grammar create mode 100644 code/FORTRAN2C/fortran2c/CWriter.java create mode 100644 code/FORTRAN2C/fortran2c/Compiler.java create mode 100644 code/FORTRAN2C/fortran2c/Translation.java (limited to 'code/FORTRAN2C') diff --git a/code/FORTRAN2C/Makefile b/code/FORTRAN2C/Makefile new file mode 100644 index 0000000..87610cf --- /dev/null +++ b/code/FORTRAN2C/Makefile @@ -0,0 +1,8 @@ +all: + java -jar ../../../sablecc-3.7/lib/sablecc.jar fortran2c.grammar + +clean: + rm -rfv fortran2c/analysis/ + rm -rfv fortran2c/lexer/ + rm -rfv fortran2c/node/ + rm -rvf fortran2c/parser/ diff --git a/code/FORTRAN2C/build/out.c b/code/FORTRAN2C/build/out.c new file mode 100644 index 0000000..47d2d58 --- /dev/null +++ b/code/FORTRAN2C/build/out.c @@ -0,0 +1,6 @@ +#include +#include + +int main(int argc, char** argv) { + +} \ No newline at end of file diff --git a/code/FORTRAN2C/examples/maths.txt b/code/FORTRAN2C/examples/maths.txt new file mode 100644 index 0000000..36726f5 --- /dev/null +++ b/code/FORTRAN2C/examples/maths.txt @@ -0,0 +1 @@ +(36/2 + 45.2) * 3 \ No newline at end of file diff --git a/code/FORTRAN2C/examples/maths2.txt b/code/FORTRAN2C/examples/maths2.txt new file mode 100644 index 0000000..313296b --- /dev/null +++ b/code/FORTRAN2C/examples/maths2.txt @@ -0,0 +1 @@ +sin(45 * 2) / 3 diff --git a/code/FORTRAN2C/examples/maths3.txt b/code/FORTRAN2C/examples/maths3.txt new file mode 100644 index 0000000..e092af1 --- /dev/null +++ b/code/FORTRAN2C/examples/maths3.txt @@ -0,0 +1 @@ +3-1+2 \ No newline at end of file diff --git a/code/FORTRAN2C/examples/maths4.txt b/code/FORTRAN2C/examples/maths4.txt new file mode 100644 index 0000000..a922b77 --- /dev/null +++ b/code/FORTRAN2C/examples/maths4.txt @@ -0,0 +1 @@ +2 + 2 diff --git a/code/FORTRAN2C/fortran2c.grammar b/code/FORTRAN2C/fortran2c.grammar new file mode 100644 index 0000000..80bf2b7 --- /dev/null +++ b/code/FORTRAN2C/fortran2c.grammar @@ -0,0 +1,35 @@ +Package fortran2c; +Helpers + digit = ['0' .. '9']; +Tokens + number = digit+; + double = ((digit)+ '.' (digit)*) | ((digit)* '.' (digit)+); + plus = '+'; + minus = '-'; + mult = '*'; + div = '/'; + mod = '%'; + l_par = '('; + r_par = ')'; + sin = 'sin'; + blank = (' ' | 13 | 10)+; +Ignored Tokens + blank; +Productions + expr = + {factor} factor | + {plus} expr plus factor | + {minus} expr minus factor + ; + factor = + {term} term | + {mult} factor mult term | + {div} factor div term | + {mod} factor mod term + ; + term = + {number} number | + {double} double | + {expr} l_par expr r_par | + {sine} sin l_par expr r_par + ; \ No newline at end of file diff --git a/code/FORTRAN2C/fortran2c/CWriter.java b/code/FORTRAN2C/fortran2c/CWriter.java new file mode 100644 index 0000000..fec748a --- /dev/null +++ b/code/FORTRAN2C/fortran2c/CWriter.java @@ -0,0 +1,26 @@ +package fortran2c; + +import java.io.*; +import java.util.HashSet; + +public class CWriter { + + private String filePath; + private File theFile; + private FileWriter theFileWriter; + private HashSet functions; + + public CWriter(String filePath) throws IOException { + this.filePath = filePath; + File theFile = new File(filePath); + + if (theFile.createNewFile()) { + FileWriter theFileWriter = new FileWriter(filePath); + theFileWriter.write("#include \n#include \n\nint main(int argc, char** argv) {\n}"); + theFileWriter.close(); + functions.add("main"); + } else { + throw new IOException("The file already exists"); + } + } +} diff --git a/code/FORTRAN2C/fortran2c/Compiler.java b/code/FORTRAN2C/fortran2c/Compiler.java new file mode 100644 index 0000000..7b124fa --- /dev/null +++ b/code/FORTRAN2C/fortran2c/Compiler.java @@ -0,0 +1,28 @@ +package fortran2c; +import fortran2c.parser.*; +import fortran2c.lexer.*; +import fortran2c.node.*; +import java.io.*; + +public class Compiler +{ + public static void main(String[] args) + { + try + { + System.out.println("Using source file: " + args[0]); + // Create a Parser instance. + Parser p = new Parser(new Lexer(new PushbackReader(new InputStreamReader(new FileInputStream(args[0])), 1024))); + // Parse the input. + Start tree = p.parse(); + // Apply the translation. + CWriter cWriter = new CWriter("build/out.c"); + + tree.apply(new Translation(cWriter)); + } + catch(Exception e) + { + System.out.println(e.getMessage()); + } + } +} \ No newline at end of file diff --git a/code/FORTRAN2C/fortran2c/Translation.java b/code/FORTRAN2C/fortran2c/Translation.java new file mode 100644 index 0000000..f5eeaba --- /dev/null +++ b/code/FORTRAN2C/fortran2c/Translation.java @@ -0,0 +1,13 @@ +package fortran2c; +import fortran2c.analysis.*; +import fortran2c.node.*; + +class Translation extends DepthFirstAdapter +{ + + private CWriter writer; + + public Translation(CWriter writer) { + this.writer = writer; + } +} -- cgit v1.2.3