Skip to content

Commit 4dcb990

Browse files
committed
Data types modified
1 parent 479c03f commit 4dcb990

File tree

13 files changed

+155
-116
lines changed

13 files changed

+155
-116
lines changed

Compiler/Demo.j

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,10 @@
44
.method static public main([Ljava/lang/String;)V
55
.limit stack 100
66
.limit locals 100
7-
ldc 4.3
8-
fstore 0
9-
ldc 4.3
10-
ldc 4.5
11-
fstore 1
12-
ldc 4.5
13-
ldc 4
14-
i2f
15-
fstore 2
7+
ldc " HelloWorld "
8+
astore 0
169
getstatic java/lang/System/out Ljava/io/PrintStream;
17-
fload 0
18-
fload 1
19-
fadd
20-
fload 2
21-
fadd
22-
invokevirtual java/io/PrintStream/println(F)V
10+
aload 0
11+
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
2312
return
2413
.end method

Compiler/code.pc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
a=4.3,b=4.5,c=4
2-
println(a+b+c)
1+
d=" HelloWorld "
2+
println(d)

Compiler/src/pc/compiler/Compiler.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import java.io.IOException;
66
import java.util.HashMap;
77

8-
import pc.compiler.errors.VariableAlreadyDefined;
98
import pc.compiler.errors.VariableNotDefined;
109
import pc.compiler.symbolTable.SymbolTableNode;
1110
import pc.parser.PCBaseVisitor;
@@ -20,6 +19,7 @@
2019
import pc.parser.PCParser.PrintContext;
2120
import pc.parser.PCParser.PrintlnContext;
2221
import pc.parser.PCParser.ProgramContext;
22+
import pc.parser.PCParser.StringContext;
2323
import pc.parser.PCParser.SubtractContext;
2424
import pc.parser.PCParser.VariableContext;
2525

@@ -65,20 +65,29 @@ public String visitProgram(ProgramContext ctx) {
6565
public String visitPrint(PrintContext ctx) {
6666
appendToFile(begPrint);
6767
visit(ctx.exp);
68-
appendToFile(endPrint + "(" + type.toUpperCase() + ")V");
68+
appendToFile(endPrint + "(");
69+
if(type.equals("Ljava/lang/String;"))
70+
appendToFile(type + ")V");
71+
else
72+
appendToFile(type.toUpperCase() + ")V");
6973
return null;
7074
}
7175

7276
public String visitPrintln(PrintlnContext ctx) {
7377
appendToFile(begPrint);
7478
visit(ctx.exp);
75-
appendToFile(endPrint + "ln(" + type.toUpperCase() + ")V");
79+
appendToFile(endPrint + "ln(");
80+
if(type.equals("Ljava/lang/String;"))
81+
appendToFile(type + ")V");
82+
else
83+
appendToFile(type.toUpperCase() + ")V");
7684
return null;
7785
}
7886

7987
public String visitAdd(AddContext ctx) {
8088
visitChildren(ctx);
81-
appendToFile("\n" + type.toLowerCase() + "add");
89+
if(type!=null && !type.equals("Ljava/lang/String;"))
90+
appendToFile("\n" + type.toLowerCase() + "add");
8291
return null;
8392
}
8493

@@ -102,6 +111,8 @@ public String visitDivide(DivideContext ctx) {
102111

103112
public String visitDigit(DigitContext ctx) {
104113
appendToFile("\nldc " + ctx.digit.getText());
114+
if(type!=null && type.equals("Ljava/lang/String;"))
115+
prevType = "Ljava/lang/String;";
105116
if(type!=null && type.equals("f"))
106117
appendToFile("\ni2f");
107118
else
@@ -117,20 +128,29 @@ public String visitDecimal(DecimalContext ctx) {
117128
return null;
118129
}
119130

131+
public String visitString(StringContext ctx) {
132+
type = "Ljava/lang/String;";
133+
appendToFile("\nldc " + ctx.str.getText());
134+
return null;
135+
}
136+
120137
public String visitVariable(VariableContext ctx) {
121138
if(symbolTable.get(ctx.var.getText())!=null) {
122139
SymbolTableNode tmp = symbolTable.get(ctx.var.getText());
123140
type = tmp.getType();
141+
if(type.equals("Ljava/lang/String;"))
142+
type = "a";
124143
if(!floatBool && type.equals("f") && prevType!=null && prevType.equals("i"))
125144
appendToFile("\ni2f");
126145
if(type.equals("f"))
127146
floatBool = true;
128147
appendToFile("\n" + type.toLowerCase() + "load " + tmp);
129-
prevType = type;
130148
if(type!=null && type.equals("i") && floatBool) {
131149
appendToFile("\ni2f");
132150
type = "f";
133151
}
152+
if(type.equals("a"))
153+
type="Ljava/lang/String;";
134154
}
135155
else
136156
throw new VariableNotDefined(ctx.getText(), ctx.var.getText(), lineNumber);
@@ -149,8 +169,8 @@ public String visitMultipleVariable(MultipleVariableContext ctx) {
149169
visit(ctx.exp);
150170
if(symbolTable.get(ctx.var.getText())==null)
151171
symbolTable.put(ctx.var.getText(), new SymbolTableNode(ctx.var.getText(), type, symbolTable.size()));
152-
else
153-
throw new VariableAlreadyDefined(ctx.getText(), ctx.var.getText(), lineNumber);
172+
if(type.equals("Ljava/lang/String;"))
173+
type = "a";
154174
appendToFile("\n" + type.toLowerCase() + "store " + symbolTable.get(ctx.var.getText()));
155175
visitChildren(ctx);
156176
return null;
@@ -160,8 +180,8 @@ public String visitLastVariable(LastVariableContext ctx) {
160180
visit(ctx.exp);
161181
if(symbolTable.get(ctx.var.getText())==null)
162182
symbolTable.put(ctx.var.getText(), new SymbolTableNode(ctx.var.getText(), type, symbolTable.size()));
163-
else
164-
throw new VariableAlreadyDefined(ctx.getText(), ctx.var.getText(), lineNumber);
183+
if(type.equals("Ljava/lang/String;"))
184+
type = "a";
165185
appendToFile("\n" + type.toLowerCase() + "store " + symbolTable.get(ctx.var.getText()));
166186
return null;
167187
}

Compiler/src/pc/compiler/errors/VariableAlreadyDefined.java

Lines changed: 0 additions & 12 deletions
This file was deleted.

Parser/bin/pc/parser/PC.tokens

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ T__8=9
1010
T__9=10
1111
DIGIT=11
1212
DECIMAL=12
13-
IDENTIFIER=13
14-
WHITESPACE=14
13+
STRING=13
14+
IDENTIFIER=14
15+
WHITESPACE=15
1516
'print('=1
1617
')'=2
1718
'println('=3

Parser/bin/pc/parser/PCLexer.tokens

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ T__8=9
1010
T__9=10
1111
DIGIT=11
1212
DECIMAL=12
13-
IDENTIFIER=13
14-
WHITESPACE=14
13+
STRING=13
14+
IDENTIFIER=14
15+
WHITESPACE=15
1516
'print('=1
1617
')'=2
1718
'println('=3

Parser/grammar/PC.g4

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ expression : leftExp=expression '/' rightExp=expression #Divide
2222
| digit=DIGIT #Digit
2323
| decimal=DECIMAL #Decimal
2424
| var=IDENTIFIER #Variable
25+
| str=STRING #String
2526
;
2627

2728
newLine : '\n' #Line
2829
;
2930

3031
DIGIT : [0-9]+;
3132
DECIMAL : [0-9]+ '.' [0-9]+;
33+
STRING : '"'[a-zA-Z0-9\n\r\t ]*'"';
3234
IDENTIFIER : [a-zA-Z][a-zA-Z0-9]*;
3335
WHITESPACE : [\r\t ]->skip;

Parser/src/pc/parser/PC.tokens

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ T__8=9
1010
T__9=10
1111
DIGIT=11
1212
DECIMAL=12
13-
IDENTIFIER=13
14-
WHITESPACE=14
13+
STRING=13
14+
IDENTIFIER=14
15+
WHITESPACE=15
1516
'print('=1
1617
')'=2
1718
'println('=3

Parser/src/pc/parser/PCBaseVisitor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ public class PCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements PCV
102102
* {@link #visitChildren} on {@code ctx}.</p>
103103
*/
104104
@Override public T visitSubtract(PCParser.SubtractContext ctx) { return visitChildren(ctx); }
105+
/**
106+
* {@inheritDoc}
107+
*
108+
* <p>The default implementation returns the result of calling
109+
* {@link #visitChildren} on {@code ctx}.</p>
110+
*/
111+
@Override public T visitString(PCParser.StringContext ctx) { return visitChildren(ctx); }
105112
/**
106113
* {@inheritDoc}
107114
*

Parser/src/pc/parser/PCLexer.java

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ public class PCLexer extends Lexer {
1818
new PredictionContextCache();
1919
public static final int
2020
T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
21-
T__9=10, DIGIT=11, DECIMAL=12, IDENTIFIER=13, WHITESPACE=14;
21+
T__9=10, DIGIT=11, DECIMAL=12, STRING=13, IDENTIFIER=14, WHITESPACE=15;
2222
public static String[] modeNames = {
2323
"DEFAULT_MODE"
2424
};
2525

2626
public static final String[] ruleNames = {
2727
"T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8",
28-
"T__9", "DIGIT", "DECIMAL", "IDENTIFIER", "WHITESPACE"
28+
"T__9", "DIGIT", "DECIMAL", "STRING", "IDENTIFIER", "WHITESPACE"
2929
};
3030

3131
private static final String[] _LITERAL_NAMES = {
@@ -34,7 +34,7 @@ public class PCLexer extends Lexer {
3434
};
3535
private static final String[] _SYMBOLIC_NAMES = {
3636
null, null, null, null, null, null, null, null, null, null, null, "DIGIT",
37-
"DECIMAL", "IDENTIFIER", "WHITESPACE"
37+
"DECIMAL", "STRING", "IDENTIFIER", "WHITESPACE"
3838
};
3939
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
4040

@@ -91,30 +91,33 @@ public PCLexer(CharStream input) {
9191
public ATN getATN() { return _ATN; }
9292

9393
public static final String _serializedATN =
94-
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\20Z\b\1\4\2\t\2\4"+
94+
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\21e\b\1\4\2\t\2\4"+
9595
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
96-
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3"+
97-
"\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b"+
98-
"\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\f\6\fA\n\f\r\f\16\fB\3\r\6\rF\n\r\r\r"+
99-
"\16\rG\3\r\3\r\6\rL\n\r\r\r\16\rM\3\16\3\16\7\16R\n\16\f\16\16\16U\13"+
100-
"\16\3\17\3\17\3\17\3\17\2\2\20\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13"+
101-
"\25\f\27\r\31\16\33\17\35\20\3\2\6\3\2\62;\4\2C\\c|\5\2\62;C\\c|\5\2\13"+
102-
"\13\17\17\"\"]\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3"+
103-
"\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2"+
104-
"\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\3\37\3\2\2\2\5&\3"+
105-
"\2\2\2\7(\3\2\2\2\t\61\3\2\2\2\13\63\3\2\2\2\r\65\3\2\2\2\17\67\3\2\2"+
106-
"\2\219\3\2\2\2\23;\3\2\2\2\25=\3\2\2\2\27@\3\2\2\2\31E\3\2\2\2\33O\3\2"+
107-
"\2\2\35V\3\2\2\2\37 \7r\2\2 !\7t\2\2!\"\7k\2\2\"#\7p\2\2#$\7v\2\2$%\7"+
108-
"*\2\2%\4\3\2\2\2&\'\7+\2\2\'\6\3\2\2\2()\7r\2\2)*\7t\2\2*+\7k\2\2+,\7"+
109-
"p\2\2,-\7v\2\2-.\7n\2\2./\7p\2\2/\60\7*\2\2\60\b\3\2\2\2\61\62\7?\2\2"+
110-
"\62\n\3\2\2\2\63\64\7.\2\2\64\f\3\2\2\2\65\66\7\61\2\2\66\16\3\2\2\2\67"+
111-
"8\7,\2\28\20\3\2\2\29:\7/\2\2:\22\3\2\2\2;<\7-\2\2<\24\3\2\2\2=>\7\f\2"+
112-
"\2>\26\3\2\2\2?A\t\2\2\2@?\3\2\2\2AB\3\2\2\2B@\3\2\2\2BC\3\2\2\2C\30\3"+
113-
"\2\2\2DF\t\2\2\2ED\3\2\2\2FG\3\2\2\2GE\3\2\2\2GH\3\2\2\2HI\3\2\2\2IK\7"+
114-
"\60\2\2JL\t\2\2\2KJ\3\2\2\2LM\3\2\2\2MK\3\2\2\2MN\3\2\2\2N\32\3\2\2\2"+
115-
"OS\t\3\2\2PR\t\4\2\2QP\3\2\2\2RU\3\2\2\2SQ\3\2\2\2ST\3\2\2\2T\34\3\2\2"+
116-
"\2US\3\2\2\2VW\t\5\2\2WX\3\2\2\2XY\b\17\2\2Y\36\3\2\2\2\7\2BGMS\3\b\2"+
117-
"\2";
96+
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\3\2\3\2\3\2\3\2\3\2"+
97+
"\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\6\3\6\3"+
98+
"\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\f\6\fC\n\f\r\f\16\fD\3\r\6"+
99+
"\rH\n\r\r\r\16\rI\3\r\3\r\6\rN\n\r\r\r\16\rO\3\16\3\16\7\16T\n\16\f\16"+
100+
"\16\16W\13\16\3\16\3\16\3\17\3\17\7\17]\n\17\f\17\16\17`\13\17\3\20\3"+
101+
"\20\3\20\3\20\2\2\21\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27"+
102+
"\r\31\16\33\17\35\20\37\21\3\2\7\3\2\62;\b\2\13\f\17\17\"\"\62;C\\c|\4"+
103+
"\2C\\c|\5\2\62;C\\c|\5\2\13\13\17\17\"\"i\2\3\3\2\2\2\2\5\3\2\2\2\2\7"+
104+
"\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2"+
105+
"\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2"+
106+
"\35\3\2\2\2\2\37\3\2\2\2\3!\3\2\2\2\5(\3\2\2\2\7*\3\2\2\2\t\63\3\2\2\2"+
107+
"\13\65\3\2\2\2\r\67\3\2\2\2\179\3\2\2\2\21;\3\2\2\2\23=\3\2\2\2\25?\3"+
108+
"\2\2\2\27B\3\2\2\2\31G\3\2\2\2\33Q\3\2\2\2\35Z\3\2\2\2\37a\3\2\2\2!\""+
109+
"\7r\2\2\"#\7t\2\2#$\7k\2\2$%\7p\2\2%&\7v\2\2&\'\7*\2\2\'\4\3\2\2\2()\7"+
110+
"+\2\2)\6\3\2\2\2*+\7r\2\2+,\7t\2\2,-\7k\2\2-.\7p\2\2./\7v\2\2/\60\7n\2"+
111+
"\2\60\61\7p\2\2\61\62\7*\2\2\62\b\3\2\2\2\63\64\7?\2\2\64\n\3\2\2\2\65"+
112+
"\66\7.\2\2\66\f\3\2\2\2\678\7\61\2\28\16\3\2\2\29:\7,\2\2:\20\3\2\2\2"+
113+
";<\7/\2\2<\22\3\2\2\2=>\7-\2\2>\24\3\2\2\2?@\7\f\2\2@\26\3\2\2\2AC\t\2"+
114+
"\2\2BA\3\2\2\2CD\3\2\2\2DB\3\2\2\2DE\3\2\2\2E\30\3\2\2\2FH\t\2\2\2GF\3"+
115+
"\2\2\2HI\3\2\2\2IG\3\2\2\2IJ\3\2\2\2JK\3\2\2\2KM\7\60\2\2LN\t\2\2\2ML"+
116+
"\3\2\2\2NO\3\2\2\2OM\3\2\2\2OP\3\2\2\2P\32\3\2\2\2QU\7$\2\2RT\t\3\2\2"+
117+
"SR\3\2\2\2TW\3\2\2\2US\3\2\2\2UV\3\2\2\2VX\3\2\2\2WU\3\2\2\2XY\7$\2\2"+
118+
"Y\34\3\2\2\2Z^\t\4\2\2[]\t\5\2\2\\[\3\2\2\2]`\3\2\2\2^\\\3\2\2\2^_\3\2"+
119+
"\2\2_\36\3\2\2\2`^\3\2\2\2ab\t\6\2\2bc\3\2\2\2cd\b\20\2\2d \3\2\2\2\b"+
120+
"\2DIOU^\3\b\2\2";
118121
public static final ATN _ATN =
119122
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
120123
static {

0 commit comments

Comments
 (0)