package scanner;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import parser.Reader;
import errors.Errors;
import errors.Messages;
import globalCtrl.Settings;
public class Source {
// jmeno vstupniho souboru private String inname, outname;
// symboly obsazene ve vstupnim kodu
private Symbol[] symbols = new Symbol[10000];
// getter pro symboly
public Symbol[] getSymbols() { return this.symbols;
}
// setter pro nazev vstupniho souboru public void setFile(String name) {
this.inname = name;
this.outname = name + "sym";
}
// vlozeni symbolu - setrime radky, nesahame na konstruktor Symbol() private void insSymbol(int index, int line, String sym, String val) {
symbols[index] = new Symbol();
symbols[index].setSymbol(sym);
symbols[index].setValue(val);
symbols[index].setLine(line);
Info.setActualLine(line);
Messages.creating("symbol '" + sym + " " + val + "' v poradi " + index);
}
// rozpoznani jednotlivych symbolu public void scan() {
try {
FileReader fr = new FileReader(inname);
BufferedReader br = new BufferedReader(fr);
String s;
String word = "";
int line = 0;
int order = 0;
while ((s = br.readLine()) != null) { int index = 0;
line++;
while ((index < s.length()) && (s.charAt(index) != '#')) { if (s.charAt(index) == ' ') {
index++;
}
else if (((s.charAt(index) >= 'A') && (s.charAt(index) <= 'Z'))
&& ((s.charAt(index + 1) >= 'A') && (s.charAt(index + 1) <= 'Z'))) { // AND
if (s.charAt(index) == 'A') { word += s.charAt(index++);
if (s.charAt(index) == 'N') {
word += s.charAt(index++);
if (s.charAt(index) == 'D') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_And", "");
}
}
} // DO
else if (s.charAt(index) == 'D') { word += s.charAt(index++);
if (s.charAt(index) == 'O') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Do", "");
}
}
// ELSE
else if (s.charAt(index) == 'E') { word += s.charAt(index++);
if (s.charAt(index) == 'L') { word += s.charAt(index++);
if (s.charAt(index) == 'S') { word += s.charAt(index++);
if (s.charAt(index) == 'E') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Else", "");
}
}
}
} // FOR
else if (s.charAt(index) == 'F') { word += s.charAt(index++);
if (s.charAt(index) == 'O') { word += s.charAt(index++);
if (s.charAt(index) == 'R') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_For", "");
}
}
} // HLP
else if (s.charAt(index) == 'H') { word += s.charAt(index++);
if (s.charAt(index) == 'L') { word += s.charAt(index++);
if (s.charAt(index) == 'P') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Hlp", "");
}
}
} // IN
else if (s.charAt(index) == 'I') { word += s.charAt(index++);
if (s.charAt(index) == 'N') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_In", "");
}
// IF
else if (s.charAt(index) == 'F') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_If", "");
}
} // NAME
else if (s.charAt(index) == 'N') { word += s.charAt(index++);
if (s.charAt(index) == 'A') { word += s.charAt(index++);
if (s.charAt(index) == 'M') { word += s.charAt(index++);
if (s.charAt(index) == 'E') {
word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Name", "");
Reader.incFuncCount();
}
}
// NAND
else if (s.charAt(index) == 'N') { word += s.charAt(index++);
if (s.charAt(index) == 'D') {
word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Nand", "");
}
}
}
// NOR
else if (s.charAt(index) == 'O') { word += s.charAt(index++);
if (s.charAt(index) == 'R') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Nor", "");
}
}
// NXOR
else if (s.charAt(index) == 'X') { word += s.charAt(index++);
if (s.charAt(index) == 'O') { word += s.charAt(index++);
if (s.charAt(index) == 'R') {
word += s.charAt(index++);
insSymbol(order++, line, "s_Nxor", "");
Messages.finding("klicove slovo " + word);
}
}
} } // OR
else if (s.charAt(index) == 'O') { word += s.charAt(index++);
if (s.charAt(index) == 'R') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Or", "");
}
//OUT
else if (s.charAt(index) == 'U') { word += s.charAt(index++);
if (s.charAt(index) == 'T') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Out", "");
}
}
}
// PIN
else if (s.charAt(index) == 'P') { word += s.charAt(index++);
if (s.charAt(index) == 'I') { word += s.charAt(index++);
if (s.charAt(index) == 'N') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Pin", "");
}
}
else if (s.charAt(index) == 'O') { word += s.charAt(index++);
if (s.charAt(index) == 'R') { word += s.charAt(index++);
if (s.charAt(index) == 'T') { word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Port", "");
}
}
}
} // XOR
else if (s.charAt(index) == 'X') { word += s.charAt(index++);
if (s.charAt(index) == 'O') { word += s.charAt(index++);
if (s.charAt(index) == 'R') {
word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_Xor", "");
}
}
}
// WHILE
else if (s.charAt(index) == 'W') { word += s.charAt(index++);
if (s.charAt(index) == 'H') { word += s.charAt(index++);
if (s.charAt(index) == 'I') {
word += s.charAt(index++);
if (s.charAt(index) == 'L') {
word += s.charAt(index++);
if (s.charAt(index) == 'E') {
word += s.charAt(index++);
Messages.finding("klicove slovo " + word);
insSymbol(order++, line, "s_While", "");
}
}
}
}
}
else Errors.expect(order, "klicove slovo");
}
// ID - identifikator funkce (zacinajici velkym pismenem)
else if ((s.charAt(index) >= 'A') && (s.charAt(index) <= 'Z')) { word += s.charAt(index++);
while ((s.length() > index) && (((s.charAt(index) >= 'a') && (s.charAt(index)
<= 'z'))
|| ((s.charAt(index) >= '0') && (s.charAt(index) <= '9')))) { word += s.charAt(index++);
}
Messages.finding("identifikator funkce '" + word + "'");
insSymbol(order++, line, "s_Id", word);
word = "";
}
else if ((s.charAt(index) >= 'a') && (s.charAt(index) <= 'z')) { // binarni cislo
if ((s.charAt(index) == 'b')
&& ((s.charAt(index + 1) >= '0') && (s.charAt(index + 1) <= '1'))) { index++;
while ((s.length() > index) && (s.charAt(index) >= '0') && (s.charAt (index) <= '1')) {
word += s.charAt(index++);
}
Messages.finding("binarni cislo " + word);
insSymbol(order++, line, "s_Bnum", word);
word = "";
}
// oktalove cislo
else if ((s.charAt(index) == 'o')
&& ((s.charAt(index + 1) >= '0') && (s.charAt(index + 1) <= '7'))) { index++;
while ((s.length() > index) && (s.charAt(index) >= '0') && (s.charAt (index) <= '7')) {
word += s.charAt(index++);
}
Messages.finding("oktalove cislo " + word);
insSymbol(order++, line, "s_Onum", word);
word = "";
}
// decimalni cislo
else if ((s.charAt(index) == 'd')
&& ((s.charAt(index + 1) >= '0') && (s.charAt(index + 1) <= '9'))) { index++;
while ((s.length() > index) && (s.charAt(index) >= '0') && (s.charAt (index) <= '9')) {
word += s.charAt(index++);
}
Messages.finding("decimalni cislo " + word);
insSymbol(order++, line, "s_Dnum", word);
word = "";
}
// hexadecimalni cislo
else if ((s.charAt(index) == 'h')
&& (((s.charAt(index + 1) >= '0') && (s.charAt(index + 1) <= '9')) || ((s.charAt(index + 1) >= 'A') && (s.charAt(index + 1) <= 'F')))) { index++;
while ((s.length() > index) && ((s.charAt(index) >= '0') && (s.charAt (index) <= '9'))
|| ((s.charAt(index) >= 'A') && (s.charAt(index) <= 'F'))){
word += s.charAt(index++);
}
Messages.finding("hexadecimalni cislo " + word);
insSymbol(order++, line, "s_Hnum", word);
word = "";
}
// oznaceni pinu (p<cislo>.<cislo>) else if ((s.charAt(index) == 'p')
&& ((s.charAt(index + 1) >= '0') && (s.charAt(index + 1) <= '4')) && (s.charAt(index + 2) == '.')
&& (s.charAt(index + 3) >= '0') && (s.charAt(index + 3) <= '7')) { word += s.charAt(index++);
word += s.charAt(index++);
word += s.charAt(index++);
word += s.charAt(index++);
Messages.finding("oznaceni pinu " + word);
insSymbol(order++, line, "s_Addr", word);
word = "";
}
// oznaceni pinu (p<cislo>.<cislo>) else if ((s.charAt(index) == 'p')
&& ((s.charAt(index + 1) >= '0') && (s.charAt(index + 1) <= '4'))) { word += s.charAt(index++);
word += s.charAt(index++);
Messages.finding("oznaceni portu " + word);
insSymbol(order++, line, "s_Addr", word);
word = "";
}
// VAR - identifikator promenne (zacinajici malym pismenem) else if (s.length() > index) {
word += s.charAt(index++);
while ((s.length() > index) && (((s.charAt(index) >= 'a') && (s.charAt (index) <= 'z'))
|| ((s.charAt(index) >= '0') && (s.charAt(index) <= '9')))) { word += s.charAt(index++);
}
Messages.finding("promennou " + word);
insSymbol(order++, line, "s_Var", word);
word = "";
} }
// SIZE - velikost promenne
else if (s.charAt(index) == '1') { word += s.charAt(index++);
if ((s.charAt(index) >= '0') && (s.charAt(index) <= '9')) { if (s.charAt(index) == '6') {
word += s.charAt(index++);
}
else {
while ((s.charAt(index) >= '0') && (s.charAt(index) <= '9')) index++;
Errors.msg(order, "Opravuji chybne zadani velikosti na 16 bitu");
word = "16";
}
if (s.charAt(index) == '-') { word += s.charAt(index++);
}
}
Messages.finding("bitovou velikost " + word);
insSymbol(order++, line, "s_Size", word);
}
else if (s.charAt(index) == '2') { word += s.charAt(index++);
if (s.charAt(index) == '-') { word += s.charAt(index++);
}
Messages.finding("bitovou velikost " + word);
insSymbol(order++, line, "s_Size", word);
}
else if (s.charAt(index) == '3') { word += s.charAt(index++);
if (s.charAt(index) == '2') { word += s.charAt(index++);
}
else {
while ((s.charAt(index) >= '0') && (s.charAt(index) <= '9')) index++;
Errors.msg(order, "Opravuji chybne zadani velikosti na 32 bitu");
word = "32";
}
if (s.charAt(index) == '-') { word += s.charAt(index++);
}
Messages.finding("bitovou velikost " + word);
insSymbol(order++, line, "s_Size", word);
}
else if (s.charAt(index) == '4') { word += s.charAt(index++);
if (s.charAt(index) == '-') { word += s.charAt(index++);
}
Messages.finding("bitovou velikost " + word);
insSymbol(order++, line, "s_Size", word);
}
else if (s.charAt(index) == '8') { word += s.charAt(index++);
if (s.charAt(index) == '-') { word += s.charAt(index++);
}
Messages.finding("bitovou velikost " + word);
insSymbol(order++, line, "s_Size", word);
}
else if ((s.charAt(index) >= '0') && (s.charAt(index) <= '9')){
while (((s.charAt(index) >= '0') && (s.charAt(index) <= '9')) || (s.charAt (index) == '-')) index++;
Errors.expect(order, "bitovou velikost 1, 2, 4, 8, 16 nebo 32");
}
// plus
else if (s.charAt(index) == '+') { word += s.charAt(index++);
Messages.finding("znamenko " + word);
insSymbol(order++, line, "s_Plus", "");
}
// minus
else if (s.charAt(index) == '-') { word += s.charAt(index++);
Messages.finding("znamenko " + word);
insSymbol(order++, line, "s_Minus", "");
} // krat
else if (s.charAt(index) == '*') { word += s.charAt(index++);
Messages.finding("znamenko " + word);
insSymbol(order++, line, "s_Mul", "");
}
// deleno
else if (s.charAt(index) == '/') { word += s.charAt(index++);
Messages.finding("znamenko " + word);
insSymbol(order++, line, "s_Div", "");
}
// zbytek
else if (s.charAt(index) == '%') { word += s.charAt(index++);
Messages.finding("znamenko " + word);
insSymbol(order++, line, "s_Mod", "");
}
// strednik
else if (s.charAt(index) == ';') { word += s.charAt(index++);
Messages.finding("ukoncovac '" + word + "'");
insSymbol(order++, line, "s_Sem", "");
}
// tecka
else if (s.charAt(index) == '.') { word += s.charAt(index++);
Messages.finding("tecku " + word + "'");
insSymbol(order++, line, "s_Dot", "");
}
// carka
else if (s.charAt(index) == ',') { word += s.charAt(index++);
Messages.finding("carku '" + word + "'");
insSymbol(order++, line, "s_Comma", "");
}
// dvojtecka
else if (s.charAt(index) == ':') { word += s.charAt(index++);
Messages.finding("dvojtecku '" + word + "'");
insSymbol(order++, line, "s_Col", "");
}
// leva zavorka
else if (s.charAt(index) == '(') { word += s.charAt(index++);
Messages.finding("levou zavorku '" + word + "'");
insSymbol(order++, line, "s_LBr", "");
}
// prava zavorka
else if (s.charAt(index) == ')') { word += s.charAt(index++);
Messages.finding("pravou zavorku '" + word + "'");
insSymbol(order++, line, "s_RBr", "");
}
// nerovnitko
else if (s.charAt(index) == '!') { word += s.charAt(index++);
if (s.charAt(index) == '=') { word += s.charAt(index++);
Messages.finding("nerovnitko '" + word + "'");
insSymbol(order++, line, "s_IsNEq", "");
}
else Errors.expect(order, "operator '!='");
}
else if (s.charAt(index) == '=') { word += s.charAt(index++);
Messages.finding("rovnitko '" + word + "'");
// dvojite rovnitko
if (s.charAt(index) == '=') { word += s.charAt(index++);
Messages.finding("porovnavac '" + word + "'");
insSymbol(order++, line, "s_IsEq", "");
} // rovnitko
else insSymbol(order++, line, "s_Eq", "");
}
else if (s.charAt(index) == '<') { word += s.charAt(index++);
Messages.finding("porovnavac '" + word + "'");
// mensi nebo rovno
if (s.charAt(index) == '=') { word += s.charAt(index++);
Messages.finding("porovnavac '" + word + "'");
insSymbol(order++, line, "s_IsSmEq", "");
} // mensi
else insSymbol(order++, line, "s_IsSm", "");
}
else if (s.charAt(index) == '>') { word += s.charAt(index++);
Messages.finding("porovnavac '" + word + "'");
// vetsi nebo rovno
if (s.charAt(index) == '=') { word += s.charAt(index++);
Messages.finding("porovnavac '" + word + "'");
insSymbol(order++, line, "s_IsGrEq", "");
} // vetsi
else insSymbol(order++, line, "s_IsGr", "");
}
else Errors.msg(order, "Neocekavany symbol");
word = "";
} }
} catch (FileNotFoundException e) {
System.out.println("Soubor " + inname + " neexistuje.");
} catch (IOException e) {
System.out.println("Nepodarilo se otevrit soubor " + inname + ".");
} }
// export posloupnosti symbolu do souboru public void export() {
try {
FileWriter fw = new FileWriter(outname);
BufferedWriter bw = new BufferedWriter(fw);
int i = 0;
Messages.creating("soubor se seznamem symbolu");
while (symbols[i] != null) {
bw.write(symbols[i].getSymbol());
if (!symbols[i].getValue().equals("")) bw.write(" " + symbols[i].getValue() + Settings.getLF());
} i++;
bw.close();
fw.close();
}
catch (IOException e) {
Messages.msg("Nepodarilo se vytvorit soubor " + outname);
} }
}
package scanner;
public class Symbol {
// nazev a hodnota symbolu a radek, ne kterem se nachazi private String sym;
private String value;
private int line;
// settery typu a hodnoty symbolu public void setSymbol(String s) {
this.sym = s;
}public void setValue(String s) { this.value = s;
}
public void setLine(int line) { this.line = line;
}
// gettery typu a hodnoty symbolu a jeho umisteni public String getSymbol() { return this.sym; } public String getValue() { return this.value; } public int getLine() { return this.line; } // funkce zjistujici typ symbolu
public boolean isName() { return sym.equals("s_Name"); } public boolean isIn() { return sym.equals("s_In"); } public boolean isOut() { return sym.equals("s_Out"); } public boolean isHlp() { return sym.equals("s_Hlp"); } public boolean isPin() { return sym.equals("s_Pin"); } public boolean isPort() { return sym.equals("s_Port"); } public boolean isSize() { return sym.equals("s_Size"); } public boolean isAddr() { return sym.equals("s_Addr"); } public boolean isIf() { return sym.equals("s_If"); } public boolean isElse() { return sym.equals("s_Else"); } public boolean isFor() { return sym.equals("s_For"); } public boolean isWhile() { return sym.equals("s_While"); } public boolean isDo() { return sym.equals("s_Do"); } public boolean isAnd() { return sym.equals("s_And"); } public boolean isOr() { return sym.equals("s_Or"); } public boolean isNand() { return sym.equals("s_Nand"); } public boolean isNor() { return sym.equals("s_Nor"); } public boolean isXor() { return sym.equals("s_Xor"); } public boolean isNxor() { return sym.equals("s_Nxor"); } public boolean isPlus() { return sym.equals("s_Plus"); } public boolean isMinus() { return sym.equals("s_Minus"); } public boolean isMul() { return sym.equals("s_Mul"); } public boolean isDiv() { return sym.equals("s_Div"); } public boolean isMod() { return sym.equals("s_Mod"); } public boolean isIsEq() { return sym.equals("s_IsEq"); } public boolean isIsNEq() { return sym.equals("s_IsNEq"); } public boolean isIsSm() { return sym.equals("s_IsSm"); } public boolean isIsGr() { return sym.equals("s_IsGr"); } public boolean isIsSmEq() { return sym.equals("s_IsSmEq"); } public boolean isIsGrEq() { return sym.equals("s_IsGrEq"); } public boolean isEq() { return sym.equals("s_Eq"); }
public boolean isLBr() { return sym.equals("s_LBr"); } public boolean isRBr() { return sym.equals("s_RBr"); } public boolean isBegin() { return sym.equals("s_Begin"); } public boolean isEnd() { return sym.equals("s_End"); } public boolean isSem() { return sym.equals("s_Sem"); } public boolean isCol() { return sym.equals("s_Col"); } public boolean isDot() { return sym.equals("s_Dot"); } public boolean isComma() { return sym.equals("s_Comma"); }
public boolean isBnum() { return sym.equals("s_Bnum"); } public boolean isOnum() { return sym.equals("s_Onum"); } public boolean isDnum() { return sym.equals("s_Dnum"); } public boolean isHnum() { return sym.equals("s_Hnum"); } public boolean isId() { return sym.equals("s_Id"); } public boolean isVar() { return sym.equals("s_Var"); } }
package scanner;
public class Info {
private static String actualName = "";
private static int actualLine = 0;
public static String getActualName() { return actualName; } public static void setActualName(String s) { actualName = s; } public static int getActualLine() { return actualLine; } public static void setActualLine(int i) { actualLine = i; } }