Skip to content

Commit 0e30b6f

Browse files
committed
Add sources
0 parents  commit 0e30b6f

15 files changed

Lines changed: 1268 additions & 0 deletions

input1.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
$a=3;
3+
$a=$a+3;
4+
$a=$a-3;
5+
$a=$a*3;
6+
$a=$a/3;
7+
$a=$a%3;
8+
$b=$a;
9+
$c=$a+$b;
10+
echo $a;
11+
print $a;
12+
echo "Text1";
13+
for($a = 0; $a < 5; $a++) {
14+
echo $a;
15+
}
16+
while($a < 5) {
17+
echo $a;
18+
$a++;
19+
}
20+
if ($a == 0) {
21+
echo "Text1";
22+
}
23+
else if ($a == 1) {
24+
echo "Text2";
25+
}
26+
else {
27+
echo "Text3";
28+
}
29+
echo "String 1\n";
30+
$string_var = "String 2";
31+
echo $string_var."\n";
32+
echo "String 1"." ".$string_var;
33+
f(2);
34+
function f($a) {
35+
echo $a;
36+
}

input2.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
$a=3;
2+
$b=$a;
3+
$c=$a+$b;
4+
echo $a;
5+
print $a;
6+
echo "Text1";
7+
8+
for($t = 0; $t < 5; $t++) {
9+
echo $t;
10+
}
11+
12+
while($a < 5) {
13+
echo $a;
14+
$a++;
15+
}
16+
if ($a == 0) {
17+
echo "Text1";
18+
}
19+
else if ($a == 1) {
20+
echo "Text2";
21+
}
22+
else {
23+
echo "Text3";
24+
}
25+
echo "String 1\n";
26+
$string_var = "String 2";
27+
echo $string_var."\n";
28+
echo "String 1"." ".$string_var;
29+
f(2);
30+
31+
function f($a) {
32+
echo $a;
33+
}

src/generator/CodeGenerator.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package generator;
2+
3+
public class CodeGenerator {
4+
5+
public String print(String value){
6+
System.out.println();
7+
return "";
8+
}
9+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package generator;
2+
3+
import java.io.BufferedWriter;
4+
import java.io.File;
5+
import java.io.FileWriter;
6+
import java.io.IOException;
7+
import java.util.List;
8+
9+
public class JavaClassGenerator {
10+
11+
public static final String path = "src\\generated\\";
12+
private final String className;
13+
private BufferedWriter bw;
14+
15+
public JavaClassGenerator(String name) {
16+
className = name;
17+
File f = new File(path + className +".java");
18+
try {
19+
if (!f.exists())
20+
f.createNewFile();
21+
bw= new BufferedWriter(new FileWriter(f));
22+
} catch (IOException e) {
23+
System.err.println("Can't create file " + f.getName() + ":\n" + f.getAbsolutePath());
24+
}
25+
}
26+
27+
public void generateStart() throws IOException{
28+
if (bw == null) return;
29+
bw.append("package generated;\n\n");
30+
bw.append("public class "+ className +" {\n\n");
31+
}
32+
public void openMainMethod() throws IOException{
33+
if (bw == null) return;
34+
bw.append("\n\tpublic static void main(String[] args) {\n");
35+
}
36+
37+
public void openMethod(String name, String... args) throws IOException{
38+
if (bw == null) return;
39+
bw.append("\n\tprivate static void "+name+"(");
40+
for (int i = 0; i < args.length-2; i=i+2) {
41+
bw.append(args[i]+" "+ args[i+1] + ", ");
42+
}
43+
if (args.length > 0){
44+
bw.append(args[args.length-2]+" "+ args[args.length-1]);
45+
}
46+
bw.append("){\n");
47+
}
48+
49+
public void closeMethod() throws IOException{
50+
bw.append("\t}\n");
51+
}
52+
53+
public void generateEnd() throws IOException {
54+
if (bw == null) return;
55+
bw.append("}");
56+
bw.flush();
57+
bw.close();
58+
}
59+
60+
public void generateDefault(){
61+
try {
62+
generateStart();
63+
bw.append(defaultBody());
64+
generateEnd();
65+
} catch (IOException e) {
66+
e.printStackTrace();
67+
}
68+
69+
}
70+
71+
public void generateMainBody(List<String> list) throws IOException {
72+
openMainMethod();
73+
if (bw == null) return;
74+
for (int i = 0; i < list.size(); i++) {
75+
bw.append("\t\t"+list.get(i)+"\n");
76+
}
77+
closeMethod();
78+
}
79+
80+
81+
82+
private static String defaultBody() {
83+
StringBuffer sb = new StringBuffer();
84+
sb.append("\tpublic static void main(String[] args) {\n");
85+
sb.append("\t\tSystem.out.println(\"Hello WORLD!!!\");\n");
86+
sb.append("\t}\n");
87+
return sb.toString();
88+
}
89+
90+
91+
public static void main(String[] args) {
92+
JavaClassGenerator jcg = new JavaClassGenerator("HelloWorld");
93+
jcg.generateDefault();
94+
}
95+
96+
public void generateMethods(List<String> list) throws IOException {
97+
if (bw == null) return;
98+
for (int i = 0; i < list.size(); i++) {
99+
bw.append("\t"+list.get(i)+"\n");
100+
}
101+
}
102+
}

src/generator/Main.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package generator;
2+
3+
import java.io.File;
4+
import java.io.FileNotFoundException;
5+
import java.io.IOException;
6+
7+
import translator.Executer;
8+
9+
public class Main {
10+
11+
public static void main(String[] args) {
12+
//String inputname = "input2.php";
13+
//File input = new File(inputname);
14+
//çàïóñê ñ ïàðàìåòðîì - èìÿ âõîäíîãî ôàéëà
15+
if (args.length < 1)
16+
throw new IllegalArgumentException("No arguments error: need a filename");
17+
18+
File input = new File(args[0]);
19+
if (!input.exists())
20+
throw new IllegalArgumentException("File '" + args[0] + "' doesn't exist");
21+
//îòðåçàåì .php â èìåíè
22+
int lastIndex = input.getName().lastIndexOf(".");
23+
String outputname = (lastIndex == -1)? input.getName(): input.getName().substring(0, lastIndex);
24+
System.out.println("Generating " + outputname + ".java");
25+
// ãåíåðàòîð java-êëàññà
26+
JavaClassGenerator jdc = new JavaClassGenerator(outputname);
27+
try {
28+
// çàïîëíÿåò âåðõíþþ ÷àñòü êëàññà (package, public class Name)
29+
jdc.generateStart();
30+
31+
Executer e = new Executer();
32+
e.setFile(input);
33+
e.execute(); // âûçîâ àíàëèçàòîðà, â ðåçóëüòàòå â íåì áóäóò 2 ñïèñêà:
34+
//1é - êîä â main , 2é - ñïèñîê ìåòîäîâ êëàññà
35+
36+
jdc.generateMainBody(e.getCodelist()); //çàïîëíÿåì ìýéí
37+
jdc.generateMethods(e.getFunctionList()); //çàïîëíÿåò ìåòîäû
38+
39+
jdc.generateEnd(); //çàêðûâàþùàÿ ñêîáî÷êà êëàññà
40+
41+
} catch (FileNotFoundException e) {
42+
System.err.println("File "+input.getName()+" not found: \n" + input.getAbsolutePath());
43+
} catch (IOException e) {
44+
System.err.println("IO error while writing "+input.getName());
45+
}
46+
47+
48+
}
49+
}

src/translator/Executer.java

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package translator;
2+
3+
import java.io.BufferedReader;
4+
import java.io.ByteArrayInputStream;
5+
import java.io.File;
6+
import java.io.FileNotFoundException;
7+
import java.io.FileReader;
8+
import java.io.IOException;
9+
import java.io.InputStream;
10+
import java.io.InputStreamReader;
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
import translator.Parser.Type;
16+
17+
public class Executer {
18+
19+
private BufferedReader br;
20+
private List<List<Token>> listOfLexems = new ArrayList<>();
21+
22+
private List<String> strings = new ArrayList<>();
23+
private Map<String, Type> varMap;
24+
private List<String> codelist;
25+
private List<String> functionlist;
26+
27+
public static void main(String[] args) {
28+
29+
if (args.length < 1)
30+
throw new IllegalArgumentException("No arguments error: need a filename");
31+
32+
File f = new File(args[0]);
33+
if (!f.exists())
34+
throw new IllegalArgumentException("File '" + args[0] + "' doesn't exist");
35+
36+
try {
37+
Executer e = new Executer();
38+
e.br = new BufferedReader(new FileReader(f));
39+
e.execute();
40+
} catch (FileNotFoundException e1) {
41+
System.err.println("File not found");
42+
}
43+
}
44+
45+
public void execute() {
46+
47+
try {
48+
lex(); // çàïóñê ëåêñè÷åñêîãî àíàëèçà
49+
parse(); // çàïóñê ñèíòàêñè÷åñêîãî àíàëèçà
50+
} catch (ParseException e) {
51+
System.err.println(e.getMessage());
52+
} catch (LexException e) {
53+
System.err.println(e.getMessage());
54+
}
55+
}
56+
57+
/**
58+
* Äëÿ êàæäîãî ñïèñêà òîêåíîâ (ïî ñòðî÷êàì) çàïóñêàåò ñèíòàêñ. àíàëèçàòîð
59+
*
60+
* Ïîñëå áåðåò èç àíàëèçàòîðà:
61+
* - êàðòó âñåõ ïåðåìåííûõ
62+
* - êîä ìåòîäà ìýéí
63+
* - ñïèñîê ìåòîäîâ ãåíåðèðóåìîãî êëàññà
64+
* @throws ParseException
65+
*/
66+
public void parse() throws ParseException {
67+
Parser p = new Parser();
68+
for (List<Token> li : listOfLexems) {
69+
if (!li.isEmpty()){
70+
p.expr(li);
71+
}
72+
}
73+
varMap = p.getVarMap();
74+
codelist = p.getCodelist();
75+
functionlist = p.getFunctionlist();
76+
}
77+
78+
/**
79+
* Ëåêñ. àíàëèç ïî ñòðîêàì, äëÿ êàæäîé ñòðîêè âîçâð. ñïèñîê òîêåíîâ è
80+
* äîáàâëÿåò åãî â îáùèé ñïèñîê
81+
* @throws LexException
82+
*/
83+
public void lex() throws LexException {
84+
Lexer l = new Lexer();
85+
try {
86+
String str;
87+
while ((str = br.readLine()) != null) {
88+
try {
89+
List<Token> tokens = l.read(str);
90+
strings.add(str);
91+
listOfLexems.add(tokens);
92+
} catch (LexException e) {
93+
throw new LexException(e.getMessage() + "\nin " + str);
94+
}
95+
}
96+
br.close();
97+
} catch (IOException e) {
98+
System.err.println("Can't read input stream");
99+
}
100+
}
101+
102+
public void setText(String str) {
103+
clearAll();
104+
InputStream is = new ByteArrayInputStream(str.getBytes());
105+
br = new BufferedReader(new InputStreamReader(is));
106+
}
107+
108+
public void clearAll() {
109+
listOfLexems.clear();
110+
111+
// functionlist.clear();
112+
// codelist.clear();
113+
strings.clear();
114+
}
115+
116+
public List<List<Token>> getLexems() {
117+
return listOfLexems;
118+
}
119+
120+
public String getString(int i) {
121+
return strings.get(i);
122+
}
123+
124+
public void setFile(File input) throws FileNotFoundException {
125+
clearAll();
126+
br = new BufferedReader(new FileReader(input));
127+
128+
}
129+
130+
public Map<String, Type> getVarMap(){
131+
return varMap;
132+
}
133+
134+
public List<String> getCodelist() {
135+
return codelist;
136+
}
137+
138+
public List<String> getFunctionList() {
139+
return functionlist;
140+
}
141+
142+
}

src/translator/LexException.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package translator;
2+
3+
public class LexException extends Exception {
4+
5+
/**
6+
*
7+
*/
8+
private static final long serialVersionUID = 7238374723833613987L;
9+
10+
public LexException(String s) {
11+
super("Lexer error: " + s);
12+
}
13+
14+
}

0 commit comments

Comments
 (0)