Ausführung | Umgebung |
---|---|
jdk-10 | IntelliJ IDEA |
Vielleicht funktioniert es in der oben genannten Umgebung.
Vorheriger Artikel [Lassen Sie uns Lexer (1) implementieren] (https://qiita.com/mirror11akii/items/7fe6fd3143b9a1eb9683)
Diese Serie wurde mit dem Wunsch geschrieben, mit Menschen in Kontakt zu treten, die mit mir sympathisieren, mit Menschen, die sich für neue Sprachen interessieren, und mit Java-Programmierern, die Teams entwickeln wollen. Natürlich ist es in Ordnung, andere Zwecke zu verwenden und zu durchsuchen. Ich würde mich jedoch sehr freuen, wenn Sie daran interessiert wären, und es wäre sehr hilfreich, wenn Sie mir in den Kommentaren etwas mitteilen könnten.
Ich beabsichtige, Lexer ein wenig funktionsfähig zu machen. Wie Lexer hatte ich das Gefühl, dass es schwierig ist, damit umzugehen, wenn die Anzahl der Ein- und Ausgänge unterschiedlich ist und die Anzahl der Ausgänge nicht bekannt ist.
FLexer.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
public class FLexer {
static Stack<String> stack = new Stack();
//private static List<Character> brackets = Arrays.asList('(',')','{','}','[',']');
private static List<Character> operators = Arrays.asList('=','+','-','*','/');
public static FType getType(final Character c){
if(Character.isLetter(c)) return FType.alphabet;
else if(Character.isDigit(c)) return FType.digit;
else if(Character.isWhitespace(c)) return FType.space;
else if(operators.contains(c)) return FType.operator;
//else if(brackets.contains(c)) return FType.brackets;
return FType.other;
}
public static List<Character> toList(final char[] chars){
List<Character> list = new ArrayList<>();
for(Character aChar : chars){
list.add(aChar);
}
return list;
}
public static void analyze(final Character aChar){
if(stack.empty()){
stack.push(Character.toString(aChar));
}else{
final String previous = stack.pop();
if(getType(aChar) == getType(previous.charAt(0))){
stack.push(previous + aChar);
}else{
stack.push(previous);
stack.push(Character.toString(aChar));
}
}
}
public static void disp(){
System.out.println(stack);
}
}
FType.java
public enum FType{
alphabet,
digit,
space,
operator,
//bracket,
other
}
Ich habe keine "Klammern" implementiert, da dies problematisch ist, aber ich denke, dass dies durch Erhöhen des if-Zweigs von analyse () behoben werden kann.
public static List<Character> toList(...)
Ich wollte einen Lambda-Ausdruck verwenden, also habe ich eine Funktion vorbereitet, um ihn in eine Liste umzuwandeln.
public static void analyze(...)
Ich dachte, wenn ich das vorherige Element lese, könnte ich es als Stapel verwenden, also habe ich es zu einem Stapel gemacht.
Main.java
import java.io.IOException;
public class Main{
public static void main(String[] args) throws IOException{
System.out.println("\n--EAM");
char[] chars = EAM.use("lib\\test.txt", eam -> eam.read());
for (char aChar : chars) {
System.out.print(aChar);
}
System.out.println( "\n--FLexer");
FLexer.toList(chars).stream()
.forEach(FLexer::analyze);
FLexer.disp();
}
}
--EAM
close()
a = 2 + 7 * 3
log a
--FLexer
[a, , =, , 2, , +, , 7, , *, , 3,
, log, , a]
Wenn es so aussieht, ist es ein Erfolg. Wenn Sie Fragen haben, wenden Sie sich bitte.