为什么编译器说没有名称为<number>的组?

时间:2017-02-21 12:29:37

标签: java regex

我正在制作词法分析器。 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;
             }

1 个答案:

答案 0 :(得分:2)

_mainForm

更正代码,如上所示。