我正在制作词法分析器。 LINE 1-30是进口商品 FUNCTION init()只是为关键字初始化HASHTABLE。 LINE 61的枚举“TokenType”指定将要采用的标记。 当我明确宣布NUMBER时,我收到一个错误,说没有名字的小组。 LINE 96使用匹配引擎进行匹配。 如果一个组匹配,则为LINE 97 @ LINE 98创建一个令牌并返回并且匹配器移动到下一个。
public static enum TokenType{
ADDSUB("[+|-]?"),NUMBER("-?[0-9]+"),
INCDEC("[[++]|[--]]"),DIVMOD("[/|%]"),
ID("[_a-zA-Z][_a-zA-Z0-9]*"),
MUL("[*]+"), WHITESPACE("[ \t\f\r\n]+");
public final String pattern;
private TokenType(String pattern){
this.pattern=pattern;
}
}
/*we declare a data structure for holding the token data*/
public static class Token{
public TokenType type;
public String Data;
public Token(TokenType type,String Data){
this.type=type;
this.Data=Data;
}
@Override
public String toString() {
return String.format("(%s %s)", type.name(), Data);
}
}
public static ArrayList<Token> lex(String input) {
// The tokens to return
ArrayList<Token> tokens = new ArrayList<Token>();
// Lexer logic begins here
StringBuffer tokenPatternsBuffer = new StringBuffer();
for(TokenType tokenType :TokenType.values()){
tokenPatternsBuffer.append(String.format("|(?<%s>%s)", tokenType.name(), tokenType.pattern));
Pattern tokenPatterns=Pattern.compile(tokenPatternsBuffer.substring(1));
// Begin matching tokens
Matcher matcher = tokenPatterns.matcher(input);
while(matcher.find())
{if(matcher.group(TokenType.NUMBER.name())!=null){ tokens.add(new Token(TokenType.NUMBER,matcher.group(TokenType.NUMBER.name())));
continue;
} else if(matcher.group(TokenType.ID.name())!=null){
if(KW.containsValue(matcher.pattern())){
System.out.println("y");
tokens.add(new Token(TokenType.ID,matcher.group(TokenType.ID.name())));
}
else{
System.out.println("n");
tokens.add(newToken(TokenType.ID,matcher.group(TokenType.ID.name())));
continue;
}
}
}
}
return tokens;
}
答案 0 :(得分:2)
_mainForm
更正代码,如上所示。