Talk:PDAsephone
Jump to navigation
Jump to search
Implementation
An implementation in Java:
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayDeque;
import java.util.HashMap;
public class PDAsephone {
public static ArrayDeque<Character> charstack = new ArrayDeque<>();
public static ArrayDeque<PDA> pdastack = new ArrayDeque<>();
public static ArrayDeque<Character> inputbuffer = new ArrayDeque<>();
public static class PDA {
public HashMap<String, Transition> t = new HashMap<>();
public ArrayDeque<Character> stack = new ArrayDeque<>();
public char state = '0';
public static class Transition {
public boolean pop;
public char push;
public char state;
public Transition(boolean p1, char p2, char s) {
pop = p1;
push = p2;
state = s;
}
}
public PDA() {
this.t = new HashMap<>();
this.stack = new ArrayDeque<>();
this.state = '0';
}
public PDA(PDA p) {
this.t = new HashMap<>(p.t);
this.stack = new ArrayDeque<>(p.stack);
this.state = p.state;
}
public void transition(char input) {
String s = "" + input + state + (stack.isEmpty() ? '\n' : stack.peekLast());
Transition tr = t.containsKey(s) ? t.get(s) : new Transition(false, '\n', state);
state = tr.state;
if (tr.pop)
stack.removeLast();
if (tr.push != '\n')
stack.addLast(tr.push);
}
}
public static void main(String[] args) throws FileNotFoundException {
Scanner in = new Scanner(System.in);
File f = new File(in.nextLine());
Scanner fin = new Scanner(f);
String code = "";
while (fin.hasNextLine()) {
String line = fin.nextLine();
if (line.length() >= 4 ? !(line.substring(0, 4).equals(">>>>")) : true) {
code += line;
}
}
for (int i = 0; i < code.length(); i++) {
switch (code.charAt(i)) {
case '@':
pdastack.addLast(new PDA());
break;
case '%':
if (true) {
char c1 = charstack.removeLast();
char c2 = charstack.removeLast();
char c3 = charstack.removeLast();
char c4 = charstack.removeLast();
char c5 = charstack.removeLast();
char c6 = charstack.removeLast();
pdastack.peekLast().t.put("" + c1 + c2 + c3, new PDA.Transition(c4 != '0', c5, c6));
}
break;
case '!':
pdastack.peekLast().transition(charstack.removeLast());
break;
case '^':
charstack.addLast(pdastack.peekLast().stack.isEmpty() ? '\n' : pdastack.peekLast().stack.removeLast());
break;
case '.':
System.out.print(charstack.removeLast());
break;
case ',':
if (inputbuffer.isEmpty()) {
String s1 = in.nextLine();
for (int j = 0; j < s1.length(); j++)
inputbuffer.addLast(s1.charAt(j));
}
charstack.addLast(inputbuffer.removeFirst());
break;
case '"':
i++;
charstack.addLast(code.charAt(i));
break;
case '_':
charstack.addLast('\n');
break;
case 'v':
if (charstack.peekLast().charValue() != '\n')
pdastack.peekLast().stack.addLast(charstack.removeLast().charValue());
else {
charstack.removeLast();
pdastack.peekLast().stack.addLast(' ');
}
break;
case ':':
charstack.addLast(charstack.peekLast().charValue());
break;
case ';':
pdastack.addLast(new PDA(pdastack.peekLast()));
break;
case '/':
if (true) {
char c1 = charstack.removeLast();
char c2 = charstack.removeLast();
charstack.addLast(c1);
charstack.addLast(c2);
}
break;
case '\\':
if (true) {
PDA p1 = pdastack.removeLast();
PDA p2 = pdastack.removeLast();
pdastack.addLast(p1);
pdastack.addLast(p2);
}
break;
case '$':
charstack.removeLast();
break;
case '#':
pdastack.removeLast();
break;
case '|':
if (true) {
char c1 = charstack.removeLast();
if ("ABCDEFGHIJKLMNOPQRST".contains("" + c1)) {
while (!(code.charAt(i) == c1 && (i != 0 ? code.charAt(i - 1) != '"' : true))) {
i++;
}
}
else if ("abcdefghijklmnopqrst".contains("" + c1)) {
while (!(code.charAt(i) == c1 && (i != 0 ? code.charAt(i - 1) != '"' : true))) {
i--;
}
}
}
break;
}
}
}
}
- Realized just now that I forgot to sign the entry. This implementation/talk page entry was by BoundedBeans. BoundedBeans (talk) 18:47, 25 December 2022 (UTC)