Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.lang.*;
- import java.util.*;
- import java.io.*;
- import java.nio.charset.Charset;
- import JavaTeacherLib.*;
- public class SysProgrammingMainAlgorithm {
- static public LinkedList<Node> language = new LinkedList();
- static public LinkedList<TableNode> lexemaTable = new LinkedList();
- static public int getLexemaCode(String lexema, int lexemaClass) {
- for(TableNode tmp : lexemaTable) {
- if(tmp.getLexemaText().equals(lexema))return tmp.getLexemaCode();
- }
- return 0;
- }
- static public String getLexemaText(int code) {
- for(TableNode tmp : lexemaTable) {
- if(tmp.getLexemaCode() == code)return tmp.getLexemaText();
- }
- return null;
- }
- public static void printlang(){
- int count = 0;
- for (Node tmp : language) {
- int[] roole = tmp.getRoole();
- System.out.print("" + ++count + " ");
- for (int ii = 0; ii < roole.length; ++ii) {
- if (ii == 1) {
- System.out.print(" -> ");
- }
- System.out.print(getLexemaText(roole[ii]) + " ");
- if (roole.length != 1) continue;
- System.out.print(" -> ");
- }
- System.out.println("");
- }
- }
- public static void main(String[] args) {
- byte [] readline=new byte [80];
- boolean result;
- String fileName;
- MyLang testLang=null;
- int codeAction, llk=1, textLen;
- String [] menu= { "*1. Прочитати граматику з файла ",
- " 2. Лабораторна робота. Клас будує студент",
- " 3. Надрукувати граматику",
- "*4. Побудувати списки терміналів та нетерміналів",
- "*5. Пошук непродуктивних нетерміналів",
- "*6. Пошук недосяжних нетерміналів",
- "*7. Побудова списку епсілон-нетерміналів",
- " 8. Друк списку епсілон-нетерміналів",
- " 9. Пошук ліворекурсивних нетерміналів",
- " 10. Пошук різних ліворекурсивних виводів мінімальної довжини",
- " 11. Пошук праворекурсивних нетерміналів",
- " 12. Пошук різних праворекурсивних виводів мінімальної довжини",
- "*13. Побудувати множини FirstK(A), A-нетермінал",
- " 14. Вивести на термінал множини FirstK(A), A-нетермінал",
- "*15. Побудувати множини FollowK(A), A-нетермінал",
- " 16. Вивести на термінал множини FollowK(A), A-нетермінал",
- "*17. Побудувати множини FirstK(w) + FollowK(A) для правила А->w",
- " 18. Вивести на термінал FirstK(w) + FollowK(A) для всіх правил А->w",
- " 19. Вивести на термінал FirstK(w) + FollowK(A) для вибраних правил А->w",
- "*20. Перевірка сильної LL(1)-властивості",
- " 21. Побудова таблиці LL(1)-синтаксичного аналізатора",
- " 22. Синтаксичний аналізатор. Клас будує студент",
- "*23. Побудувати множини LocalK(A), A-нетермінал",
- " 24. Вивести на термінал множини LocalK(A), A-нетермінал",
- "*25. Перевірка LL(k)-властивості, k>1",
- " 26. Вихід з системи"
- };
- do {
- codeAction=0;
- String upr;
- for (String ss: menu) System.out.println(ss); // вивести меню
- System.out.println("Введіть код дії або end:");
- do { // цикл перебору даних
- try {
- textLen=System.in.read(readline);
- upr = new String (readline,0,textLen, "ISO-8859-1");
- if (upr.trim().equals("end") ) return;
- codeAction=new Integer (upr.trim());
- }
- catch(Exception ee)
- { System.out.println ("Невірний код дії, повторіть: ");
- continue;
- }
- if (codeAction >=1 && codeAction<=menu.length ) {
- if (menu [codeAction-1].substring(0, 1).equals("+")) {
- System.out.println("Елемент меню " +codeAction+" повторно виконати неможливо");
- continue ;
- }
- int itmp;
- for (itmp=0; itmp < codeAction-1; itmp++)
- if (menu[itmp].substring(0, 1).equals("*")) break;
- if (itmp !=codeAction-1) {
- System.out.println ("Виконайте попередні елементи меню, що позначені * : ");
- continue ;
- }
- break;
- }
- else {
- System.out.println ("Невірний код дії, повторіть: ");
- continue ;
- }
- } while (true);
- // перевірка на виконання усіх попередніх дій
- result=false;
- switch (codeAction) {
- case 1: //1. Прочитати граматику з файла",
- System.out.print ("Введіть ім'я файлу граматики:");
- try{
- textLen=System.in.read(readline);
- fileName = new String (readline,0,textLen, "ISO-8859-1");
- fileName = fileName.trim();
- }
- catch(Exception ee)
- { System.out.println ("Системна помилка: "+ee.toString());
- return;
- }
- BufferedReader s;
- final int maxn = 256;
- final int nterm = 0x80000000;
- final int term = 0x10000000;
- char[] lex = new char[maxn];
- int[] rule = new int[maxn];
- try {
- s = new BufferedReader(new FileReader(fileName));
- }
- catch (FileNotFoundException ee) {
- System.out.print("Файл не найден");
- return;
- }
- Arrays.fill(lex , (char)0);
- Arrays.fill(rule , 0);
- int act = 0; // 0 - хз , 1 - читаем нетерминал , 2 - читаем терминал , 3 - читаем экранированный символ
- String line = null;
- int cur_rule = 0;
- int len = 0;
- int read_pos = 0;
- int pos = 0;
- try{
- while(s.ready()){
- if (line == null || read_pos >= len) {
- line = s.readLine();
- if (line.length() > 0 && line.charAt(0) == 65279) {
- line = line.substring(1);
- }
- len = line.length();
- }
- for(read_pos = 0 ; read_pos < len ; ++read_pos){
- char cur = line.charAt(read_pos);
- if(act == 0){
- String ck = " \t\n\n\b";
- if(ck.indexOf(cur) != -1)continue;
- if(read_pos == 0 && cur_rule > 0 && (cur == '#' || cur == '!')){
- Node node = new Node(rule , cur_rule);
- language.add(node);
- if(cur == '!'){
- cur_rule = 1;
- continue;
- }else{
- cur_rule = 0;
- }
- }
- lex[0] = cur;
- pos = 1;
- if(cur == '#'){
- act = 1;
- }else if(cur == '\\'){
- act = 3;
- --pos;
- }else{
- act = 2;
- }
- continue;
- }
- if(act == 1){
- lex[pos] = cur;
- ++pos;
- if(read_pos != 0 && cur != '#')continue;
- String str = new String(lex , 0, pos);
- TableNode tnode = new TableNode(str, nterm);
- boolean find = false;
- for(TableNode tn : lexemaTable){
- if(tn.equals(tnode)){
- find = true;
- break;
- }
- }
- if(!find){
- lexemaTable.add(tnode);
- }
- int code = getLexemaCode(str, nterm);
- rule[cur_rule] = code;
- ++cur_rule;
- pos = act = 0;
- continue;
- }
- if(act == 2){
- if(cur == '\\'){
- act = 3;
- --pos;
- continue;
- }
- String ck = " #\t\r";
- if(ck.indexOf(cur) != -1 || read_pos == 0){
- String str = new String(lex , 0, pos);
- TableNode tnode = new TableNode(str , term);
- boolean find = false;
- for(TableNode tn : lexemaTable){
- if(tn.equals(tnode)){
- find = true;
- break;
- }
- }
- if(!find){
- lexemaTable.add(tnode);
- }
- int code = getLexemaCode(str , term);
- rule[cur_rule] = code;
- ++cur_rule;
- pos = act = 0;
- --read_pos;
- }else{
- lex[pos] = cur;
- ++pos;
- }
- continue;
- }
- if(act == 3){
- act = 2;
- lex[pos] = cur;
- ++pos;
- continue;
- }
- }
- }
- if(pos > 0){
- String str = new String(lex , 0, pos);
- TableNode tnode = new TableNode(str , act == 1 ? nterm : term);
- boolean find = false;
- for(TableNode tn : lexemaTable){
- if(tn.equals(tnode)){
- find = true;
- break;
- }
- }
- if(!find){
- lexemaTable.add(tnode);
- }
- int code = getLexemaCode(str , act == 1 ? nterm : term);
- rule[cur_rule] = code;
- ++cur_rule;
- }
- if (cur_rule > 0) {
- Node node = new Node(rule, cur_rule);
- language.add(node);
- }
- }catch(Exception e){}
- printlang();
- break;
- case 2: //2. Лабораторна робота студента
- System.out.print ("Введіть ім'я файлу граматики:");
- try {
- textLen=System.in.read(readline);
- fileName = new String (readline,0,textLen, "ISO-8859-1");
- fileName = fileName.trim();
- }
- catch(Exception ee)
- { System.out.println ("Системна помилка: "+ee.toString());
- return;
- }
- System.out.print ("Введіть значення параметра k : ");
- try {
- textLen=System.in.read(readline);
- String llkText = new String (readline,0,textLen, "ISO-8859-1");
- llkText = llkText.trim();
- llk=Integer.parseInt(llkText);
- }
- catch(Exception ee)
- { System.out.println ("Системна помилка: "+ee.toString());
- return;
- }
- testLang = new MyLang (fileName,llk);
- if (!testLang.isCreate()) break; //не створили об'єкт
- System.out.println ("Граматика прочитана успішно");
- result=true;
- for (int jj=0; jj<menu.length; jj++) {
- if (menu [jj].substring(0, 1).equals(" ")) continue;
- menu [jj]=menu [jj].replace(menu [jj].charAt(0), '*') ;
- }
- break;
- case 3: // Надрукувати граматику
- testLang.printGramma();
- break;
- case 4: // надрукувати список терміналів та нетерміналів
- testLang.printTerminals();
- testLang.printNonterminals();
- result=true;
- break;
- case 5: // вивести непродуктивні правила
- result=testLang.createNonProdRools();
- break;
- case 6: // недосяжні нетермінали
- result=testLang.createNonDosNeterminals();
- break;
- case 7: //Побудова списку епсілон-нетерміналів
- int [] epsilon=testLang.createEpsilonNonterminals ();
- testLang.setEpsilonNonterminals (epsilon);
- result=true;
- break;
- case 8: //Друк списку епсілон-нетерміналів
- testLang.printEpsilonNonterminals();
- break;
- case 9: //Пошук ліворекурсивних нетерміналів"
- testLang.leftRecursNonnerminal();
- break;
- case 10: //Пошук різних ліворекурсивних виводів мінімальної довжини"
- testLang.leftRecusionTrace();
- break;
- case 11: //Пошук праворекурсивних нетерміналів"
- testLang.rightRecursNonnerminal();
- break;
- case 12: //Пошук різних праворекурсивних виводів мінімальної довжини"
- testLang.rigthRecusionTrace();
- break;
- case 13: //Побудувати множини FirstK
- JavaTeacherLib.LlkContext[] firstContext = testLang.firstK();
- testLang.setFirstK(firstContext);
- result=true;
- break;
- case 14: //Друк множини FirstK
- testLang.printFirstkContext ( );
- break;
- case 15: //Побудувати множини FollowK
- JavaTeacherLib.LlkContext[] followContext = testLang.followK();
- testLang.setFollowK(followContext);
- result=true;
- break;
- case 16: //Друк множини FollowK
- testLang.printFollowkContext ( );
- break;
- case 17: //Побудувати множини FirstK(w) + FollowK(A) для правила А->w
- testLang.firstFollowK ( );
- result=true;
- break;
- case 18: //Друк множини FirstK(w) + FollowK(A) для правила А->w
- testLang.printFirstFollowK( );
- break;
- case 19: //Друк множини FirstK(w) + FollowK(A) для вибраних правил А->w
- testLang.printFirstFollowForRoole();
- break;
- case 20: //Перевірка сильної LL(k)-властивості",
- result=testLang. strongLlkCondition () ;
- break;
- case 21: //Побудова таблиці LL(1)-синтаксичного аналізатора
- int [][] uprTable=testLang.createUprTable ();
- testLang.setUprTable(uprTable);
- break;
- case 22: // PASCAL
- break;
- case 23: // 23. Побудувати множини LocalK(A), A-нетермінал
- LinkedList<JavaTeacherLib.LlkContext>[] Localk=testLang.createLocalK();
- testLang.setLocalkContext(Localk);
- result=true;
- break;
- case 24: // 24. Вивести на термінал множини LocalK(A), A-нетермінал
- testLang.printLocalk();
- break;
- case 25: // 25. Перевірка LL(k)-властивості, k>1
- result= testLang.llkCondition();
- break;
- case 26: // rtrtrtr
- return;
- case 27:
- break;
- } // кінець switch
- // блокуємо елемент обробки
- if (result) // функція виконана успішно
- if (menu [codeAction-1].substring(0, 1).equals("*"))
- menu [codeAction-1]=menu [codeAction-1].replace('*', '+') ;
- } while (true); //глобальний цикл обробки
- } // кінець main
- static void tesrReadWrite(String fname)
- { String readline;
- BufferedReader s;
- BufferedWriter bw;
- try {
- s = new BufferedReader(new FileReader(fname));
- bw = new BufferedWriter (new FileWriter("c:\\rez.txt"));
- // s=new FileInputStream (fname);
- //s=new FileInputStream ("C:\\Eclipse\\C1.txt");
- //s=new FileInputStream ("C:\\test1.txt");
- while ( s.ready() ) {
- readline= s.readLine();
- System.out.println(readline);
- //System.out.println("Read Line");
- //bw.write(readline, 0,readline.length() );
- //bw.write((int)'\r'); bw.flush();
- //System.out.println("Print Line");
- }
- //bw.close();
- }
- catch(Exception ee)
- {
- System.out.print("File: " +fname + "not found\n");
- //return;
- }
- }
- }
Add Comment
Please, Sign In to add comment