Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace DubinaLab
- {
- class SyntaxAnalys
- {
- private enum State { Start, Finish, A, B, C};
- private String formula;
- private Boolean error;
- private String errorMessage = "Ошибок не найдено.";
- private int counter, j;
- private List<int> coordsConnected;
- private List<int> coordsFree;
- private Stack<Char> brackets;
- List<PredicateVariable> vars = new List<PredicateVariable>();
- PredicateVariable variable;
- class PredicateVariable
- {
- char variable;
- int start;
- int finish;
- public PredicateVariable()
- {
- variable = 'x';
- start = 0;
- finish = 0;
- }
- public PredicateVariable(char variable, int start, int finish)
- {
- this.variable = variable;
- this.start = start;
- this.finish = finish;
- }
- public void setVariable(char variable)
- {
- this.variable = variable;
- }
- public void setStart(int start)
- {
- this.start = start;
- }
- public void setFinish(int finish)
- {
- this.finish = finish;
- }
- public char getVariable()
- {
- return variable;
- }
- public int getStart()
- {
- return start;
- }
- public int getFinish()
- {
- return finish;
- }
- }
- public List<int> getConnectedCoords()
- {
- return coordsConnected;
- }
- public List<int> getFreeCoords()
- {
- return coordsFree;
- }
- public Boolean getError()
- {
- return error;
- }
- public String getErrorMessage()
- {
- return errorMessage;
- }
- public int getCounter()
- {
- return counter;
- }
- private Boolean isItOperation(Char ch)
- {
- if (ch.Equals('∨') || ch.Equals('&') || ch.Equals('→') || ch.Equals('¬') || ch.Equals('⇔'))
- return true;
- else return false;
- }
- private Boolean isItVariable(Char ch)
- {
- if (ch.Equals('x') || ch.Equals('y') || ch.Equals('z') || ch.Equals('k') || ch.Equals('l'))
- return true;
- else return false;
- }
- private Boolean isItConst(Char ch)
- {
- if (ch.Equals('c') || ch.Equals('o') || ch.Equals('n') || ch.Equals('s') || ch.Equals('t'))
- return true;
- else return false;
- }
- private Boolean isItPredicate(Char ch)
- {
- if (ch.Equals('A') || ch.Equals('B') || ch.Equals('C') || ch.Equals('D') || ch.Equals('E'))
- return true;
- else return false;
- }
- private Boolean isItQuantifier(Char ch)
- {
- if (ch.Equals('∀') || ch.Equals('∃'))
- return true;
- else return false;
- }
- private void errorFlag(String s)
- {
- error = true;
- errorMessage = s;
- }
- public void semanticsChecking()
- {
- j = 0;
- coordsConnected = new List<int>(); // Координаты связных
- coordsFree = new List<int>(); // Координаты свободных переменных
- for (int i = 0; i < formula.Length; i++)
- {
- if (formula[i] == '∀' || formula[i] == '∃')
- {
- i++;
- variable = new PredicateVariable();
- variable.setVariable(formula[i]);
- j = i;
- do
- {
- j++;
- }
- while (formula[j] != '(');
- variable.setStart(j);
- j++;
- brackets = new Stack<char>();
- brackets.Push('(');
- while (brackets.Count > 0 && j < formula.Length)
- {
- if (formula[j] == '(')
- brackets.Push('(');
- else if (formula[j] == ')')
- brackets.Pop();
- j++;
- }
- variable.setFinish(j);
- vars.Add(variable);
- }
- }
- for(int i = 1; i < formula.Length; i++)
- if (isItVariable(formula[i]) && !isItQuantifier(formula[i - 1]))
- {
- coordsFree.Add(i);
- }
- for (int i = 0; i < vars.Count; i++)
- {
- for (j = vars[i].getStart(); j < vars[i].getFinish(); j++)
- {
- if (isItVariable(formula[j]) && !isItQuantifier(formula[j - 1]))
- {
- if (formula[j].Equals(vars[i].getVariable()))//Если проверяемая переменная совпадает с переменной из набора то она связная
- {
- coordsConnected.Add(j);
- }
- }
- }
- }
- for(int i = 0; i < coordsConnected.Count; i++)
- {
- if(coordsFree.Contains(coordsConnected[i]))
- coordsFree.Remove(coordsConnected[i]);
- }
- }
- public void syntaxСhecking(String formula)
- {
- State st = new State();
- this.formula = formula;
- st = State.Start;
- counter = 0;
- brackets = new Stack<Char>();
- while (error == false && st != State.Finish && counter < formula.Length)
- {
- switch(st)
- {
- case State.Start:
- {
- if (isItQuantifier(formula[counter]))
- {
- counter = quantifierChecking();
- st = State.C;
- }else
- if (isItPredicate(formula[counter]))
- {
- counter = predicateChecking();
- st = State.B;
- }
- else if (isItVariable(formula[counter]) || isItConst(formula[counter]))
- {
- counter++;
- st = State.B;
- }else if(formula[counter].Equals('('))
- {
- counter++;
- brackets.Push('(');
- }
- else if (formula[counter].Equals(')'))
- {
- if (brackets.Count > 0)
- {
- counter++;
- brackets.Pop();
- st = State.A;
- }
- else
- errorFlag("Лишняя скобка.");
- }
- else
- errorFlag("Ожидался квантор или предикат, или переменная, или константа, или скобка.");
- }
- break;
- case State.A:
- {
- if (formula[counter].Equals(')'))
- {
- if (brackets.Count > 0)
- {
- counter++;
- brackets.Pop();
- }
- else
- errorFlag("Лишняя скобка.");
- }
- else if (isItOperation(formula[counter]))
- {
- counter++;
- st = State.Start;
- }
- else if (formula[counter].Equals(')'))
- {
- if (brackets.Count > 0)
- {
- counter++;
- brackets.Pop();
- }
- else
- errorFlag("Лишняя скобка.");
- }
- else
- errorFlag("Ожидалась закрывающая скобка или символ операции.");
- }
- break;
- case State.B:
- {
- if (isItOperation(formula[counter]))
- {
- counter++;
- st = State.Start;
- }
- else if (formula[counter].Equals(')'))
- {
- if (brackets.Count > 0)
- {
- counter++;
- brackets.Pop();
- st = State.A;
- }
- else
- errorFlag("Лишняя скобка.");
- }
- else
- errorFlag("Ожидался символ операции.");
- }
- break;
- case State.C:
- {
- if (isItQuantifier(formula[counter]))
- {
- counter = quantifierChecking();
- st = State.C;
- }
- else
- if (isItPredicate(formula[counter]))
- {
- counter = predicateChecking();
- st = State.B;
- }
- else if (formula[counter].Equals('('))
- {
- counter++;
- brackets.Push('(');
- }
- else
- errorFlag("Ожидался предикат или открывающая скобка, или квантор.");
- }
- break;
- }
- }
- if (brackets.Count > 0 && error == false)
- errorFlag("Не все открывающие скобки закрыты.");
- //if (counter < formula.Length-1 && error == false)
- // errorFlag(" Формула не дописана.");
- //else
- if (!(isItConst(formula[counter-1]) || isItVariable(formula[counter-1]) || formula[counter-1].Equals(')')) && error == false)
- errorFlag("Формула может заканчиваться только закрывающей скобкой или переменной, или константой.");
- if (error != true)
- semanticsChecking();
- }
- private int predicateChecking()
- {
- State st = new State();
- st = State.Start;
- while (error == false && st != State.Finish && counter < formula.Length)
- {
- switch (st)
- {
- case State.Start:
- {
- if (isItPredicate(formula[counter]))
- {
- counter++;
- st = State.A;
- }
- else
- errorFlag("Ожидалась предикатная переменная");
- }
- break;
- case State.A:
- {
- if (formula[counter].Equals('('))
- {
- counter++;
- st = State.B;
- }
- else
- errorFlag("Ожидалась открывающая скобка.");
- }
- break;
- case State.B:
- {
- if (isItConst(formula[counter]) || isItVariable(formula[counter]))
- {
- counter++;
- st = State.C;
- }
- else
- errorFlag("Ожидалась переменная или константа.");
- }
- break;
- case State.C:
- {
- if (formula[counter].Equals(')'))
- {
- counter++;
- st = State.Finish;
- }
- else
- if (formula[counter].Equals(','))
- {
- counter++;
- st = State.B;
- }
- else
- errorFlag("Ожидалась запятая или закрывающая скобка.");
- }
- break;
- }
- }
- return counter;
- }
- private int quantifierChecking()
- {
- State st = new State();
- st = State.Start;
- while (error == false && st != State.Finish && counter < formula.Length)
- {
- switch (st)
- {
- case State.Start:
- {
- if (isItQuantifier(formula[counter]))
- {
- counter++;
- st = State.A;
- }
- else
- errorFlag("Ожидался квантор.");
- }
- break;
- case State.A:
- {
- if (isItVariable(formula[counter]))
- {
- counter++;
- st = State.Finish;
- }
- else
- errorFlag("Ожидалась переменная.");
- }
- break;
- }
- }
- return counter;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement