Skip to content

Commit

Permalink
Merge branch 'main' of https://github.com/Encapsulateed/tfl
Browse files Browse the repository at this point in the history
  • Loading branch information
Encapsulateed committed Jan 19, 2024
2 parents b454615 + 3fefb9a commit d713d4d
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 48 deletions.
3 changes: 2 additions & 1 deletion lab5/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
/.vscode
/.vscode
.dart_tool
147 changes: 102 additions & 45 deletions lab5/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,59 +10,116 @@ import 'src/utils/stack.dart';
// import 'src/lr0/base/LR0Fms.dart';

void main(List<String> arguments) {
List<Grammar> grammars = [];
var g = Grammar.fromFile('input.txt');

var rules_lst = [];
for (var rule in g.rules) {
if (rule.right.contains('&')) {
var curr_left = rule.left;
var rule_parts = rule.right.join('').toString().split('&');
for (var part in rule_parts) {
Production N = Production(curr_left, part.split(''));
List<Production> curr_rules_copy = [...rules_lst];
curr_rules_copy.add(N);
grammars
.add(Grammar.make(curr_rules_copy, g.nonTerminals, g.terminals));

if (arguments[1] == 'd') {
List<Grammar> grammars = [];
var g = Grammar.fromFile('input.txt');

print("Searching for Conjunctive grammar");

var rules_lst = [];
for (var rule in g.rules) {
if (rule.right.contains('&')) {
var curr_left = rule.left;
var rule_parts = rule.right.join('').toString().split('&');
for (var part in rule_parts) {
Production N = Production(curr_left, part.split(''));
List<Production> curr_rules_copy = [...rules_lst];
curr_rules_copy.add(N);
grammars
.add(Grammar.make(curr_rules_copy, g.nonTerminals, g.terminals));
}
continue;
}
rules_lst.add(rule);

for (var gg in grammars) {
gg.rules.add(rule);
}
continue;
}
rules_lst.add(rule);

String word = arguments[0];
List<bool> total = [];
print("Total amount of grammars after separating the rules: ${grammars.length}\n");
for (var gg in grammars) {
gg.rules.add(rule);
LR0Parser pp = LR0Parser(gg);
total.add(pp.Parse(word));
print("${gg.rules}\n");
}
}

String word = arguments[0];
List<bool> total = [];
print(grammars.length);
for (var gg in grammars) {
LR0Parser pp = LR0Parser(gg);
// total.add(pp.Parse(word));
bool answer = true;

print(gg.rules);
}
bool answer = true;
for (var ans in total) {
if (ans == false) {
answer = false;
break;
}
}

print("\nResult: ");
print(answer);
} else {
var g = Grammar.fromFile('input.txt');
Stack<String> inputStack = Stack();
Stack<String> tokenStack = Stack();
Stack<String> actionStack = Stack();
LR0Parser p = LR0Parser(g);

for (var ans in total) {
if (ans == false) {
answer = false;
break;
tokenStack.push('0');
inputStack.push('\$');
p.stack_screens.add(tokenStack.copyStack());

String word = arguments[0];

for (int i = word.length - 1; i >= 0; i--) {
inputStack.push(word[i]);
}

List<Stack<String>> stacks = [];
List<Stack<String>> action_stacks = [];
p.parseLR0_params(tokenStack, actionStack, inputStack, stacks, action_stacks);
print(getStrFromStack(action_stacks[0], reverse: false));
GSStack<String> stack = GSStackImpl();
Map<int, GSSNode<String>> Nodes = {};

int id = 0;

for (var stackScreen in p.stack_screens) {
for (var s in stackScreen.toList().toList()) {
Nodes[id] = stack.push(s, Nodes[id - 1]);
id++;
}
}
id = 0;
GSStack<String> stack1 = GSStackImpl();
Map<int, GSSNode<String>> Nodes1 = {};
for (var stackScreen in action_stacks) {
for (var s in stackScreen.toList().toList()) {
Nodes1[id] = stack1.push(s, Nodes1[id - 1]);
id++;
}
}
id = 0;
GSStack<String> stack2 = GSStackImpl();
Map<int, GSSNode<String>> Nodes2 = {};
for (var stackScreen in stacks) {
for (var s in stackScreen.toList().toList()) {
Nodes2[id] = stack2.push(s, Nodes2[id - 1]);
id++;
}
}
//print(getStrFromStack(stacks[0], reverse: false));

if (arguments.length == 3) {
int n = int.parse(arguments[2]);
print('STACK AT STEP ${n}\n=========================');

print(getStrFromStack(p.stack_screens[n]));
print('=========================');
}

// stack.GSStoDot('merged');
stack1.GSStoDot('actions');
stack2.GSStoDot('final');
}
print(answer);
/*
Stack<String> inputStack = Stack();
Stack<String> tokenStack = Stack();
Stack<String> actionStack = Stack();
LR0Parser p = LR0Parser(g);
tokenStack.push('0');
inputStack.push('\$');
p.stack_screens.add(tokenStack.copyStack());
p.Parse(word);
List<Stack<String>> stacks = [];*/
//p.parseLR0_params(tokenStack, actionStack, inputStack, stacks, action_stacks);
}
9 changes: 7 additions & 2 deletions lab5/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,15 @@


## Запуск лабы
* Рабочая версия базы ЛР5 (без допов) - "hope die last".
* Входную КС Грамматику необходимо поместить в файл input.txt
* В терминал ввести
* Для запуска базы ЛР5 ввести:
```bash
dart main.dart word [step]
dart main.dart b word [step]
```
* Для запуска доп задания ЛР5 (на свой страх и риск) ввести:
```bash
dart main.dart d word
```
* Оценить весь ужас полученного резуальтата

Expand Down

0 comments on commit d713d4d

Please sign in to comment.