• No results found

Soubor: /home/Matysek/BakalarkaCD/Zdrojove_kody/scanner.java Stránka 1 z 10 package

N/A
N/A
Protected

Academic year: 2022

Share "Soubor: /home/Matysek/BakalarkaCD/Zdrojove_kody/scanner.java Stránka 1 z 10 package"

Copied!
10
0
0

Loading.... (view fulltext now)

Full text

(1)

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') {

(2)

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

(3)

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", "");

(4)

}

}

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);

(5)

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++);

}

(6)

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

(7)

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", "");

(8)

}

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);

} }

(9)

}

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"); }

(10)

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; } }

References

Related documents

Note: For these functions to operate an external device (e.g. a Communication Device or an Environmental Control), needs to be connected to the Driving Scanner’s Environmental

z přírodních, většinou vlněných materiálů, které jsou vyvažovány produkty založenými na použití umělých vláken (PAD, PES, POP) Zvláště u

[r]

public static void printFile() throws IOException {..

[r]

Student na iade mist textu pouziva hovorove yirazy, coz rcvne2 nep0sobi v odborne preci zcela nejlepe (napi. 36 aj.).. Zaverje pouhe shrnuti manuelu pro

Během inovace úchopné hlavice je možno inovovat díly tak, aby se tyto inovované části mohli dále použít pro jinou sekci výroby loketních opěrek.. M

2-Color Display High-Precision Digital