我必须用 Java 为 BASIC 方言编写 Lexer。
我将所有 TokenType 分组在 Enum
public enum TokenType {
INT("-?[0-9]+"),
BOOLEAN("(TRUE|FALSE)"),
PLUS("\\+"),
MINUS("\\-"),
//others.....
}
该名称是 TokenType 名称,括号中是我用来匹配类型的正则表达式。
如果我想匹配 INT 类型,我使用“-?[0-9]+”。
但现在我有一个问题。我将 TokenType 的所有正则表达式放入 StringBuffer 中:
private String pattern() {
StringBuffer tokenPatternsBuffer = new StringBuffer();
for(TokenType token : TokenType.values())
tokenPatternsBuffer.append("|(?<" + token.name() + ">" + token.getPattern() + ")");
String tokenPatternsString = tokenPatternsBuffer.toString().substring(1);
return tokenPatternsString;
}
所以它返回一个字符串,如:
(?<INT>-?[0-9]+)|(?<BOOLEAN>(TRUE|FALSE))|(?<PLUS>\+)|(?<MINUS>\-)|(?<PRINT>PRINT)....
现在我使用这个字符串来创建一个模式
Pattern pattern = Pattern.compile(STRING);
然后我创建一个匹配器
Matcher match = pattern.match("line of code");
现在我想匹配所有的 TokenType 并将它们分组到 Token 的 ArrayList 中。如果代码语法正确,则返回一个 ArrayList of Token (Token name, value)。
但是如果语法不正确,我不知道如何退出while循环然后打印错误。
这是一段用于创建 Token 的 ArrayList 的代码。
private void lex() {
ArrayList<Token> tokens = new ArrayList<Token>();
int tokenSize = TokenType.values().length;
int counter = 0;
//Iterate over the arrayLinee (ArrayList of String) to get matches of pattern
for(String linea : arrayLinee) {
counter = 0;
Matcher match = pattern.matcher(linea);
while(match.find()) {
System.out.println(match.group(1));
counter = 0;
for(TokenType token : TokenType.values()) {
counter++;
if(match.group(token.name()) != null) {
tokens.add(new Token(token , match.group(token.name())));
counter = 0;
continue;
}
}
if(counter==tokenSize) {
System.out.println("Syntax Error in line : " + linea);
break;
}
}
tokenList.add("EOL");
}
}
如果 for 循环遍历所有 TokenType 并且不匹配 TokenType 的任何正则表达式,则代码不会中断。如果语法不正确,如何返回错误?
或者你知道我在哪里可以找到开发词法分析器的信息吗?