Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么编译器会说没有名为<;的组;数量>;?_Java_Regex - Fatal编程技术网

Java 为什么编译器会说没有名为<;的组;数量>;?

Java 为什么编译器会说没有名为<;的组;数量>;?,java,regex,Java,Regex,我正在做词法分析器。第1-30行为进口 函数init()只是初始化关键字的哈希表。 第61行“TokenType”处的枚举指定要获取的令牌。 我得到一个错误,说没有组的名称时,我已经清楚地宣布了数字。 第96行使用匹配器引擎进行匹配。 第97行如果一个组被匹配@98行创建一个令牌并返回,matcher移动到下一个令牌 public static enum TokenType{ ADDSUB("[+|-]?"),NUMBER("-?[0-9]+"), INCDEC("[[++]|[--]]"

我正在做词法分析器。第1-30行为进口 函数init()只是初始化关键字的哈希表。 第61行“TokenType”处的枚举指定要获取的令牌。 我得到一个错误,说没有组的名称时,我已经清楚地宣布了数字。 第96行使用匹配器引擎进行匹配。 第97行如果一个组被匹配@98行创建一个令牌并返回,matcher移动到下一个令牌

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;
             }
公共静态枚举令牌类型{
ADDSUB(“[+|-]”),数字(“-?[0-9]+”,
INCDEC(“[+]|[-]]”),DIVMOD(“[/|%]”),
ID(“[\u a-zA-Z][\u a-zA-Z0-9]*”,
MUL(“[*]+”),空格([\t\f\r\n]+”;
公共最终字符串模式;
专用令牌类型(字符串模式){
这个模式=模式;
}
}
/*我们声明一个用于保存令牌数据的数据结构*/
公共静态类令牌{
公共令牌类型;
公共字符串数据;
公共令牌(令牌类型、字符串数据){
this.type=type;
这个。数据=数据;
}
@凌驾
公共字符串toString(){
返回String.format((%s%s)”,type.name(),Data);
}
}
公共静态ArrayList lex(字符串输入){
//返回的代币
ArrayList标记=新的ArrayList();
//Lexer逻辑从这里开始
StringBuffer tokenPatternsBuffer=新StringBuffer();
for(TokenType TokenType:TokenType.values()){
tokenPatternsBuffer.append(String.format(“|(?%s)”,tokenType.name(),tokenType.pattern));
Pattern-tokenPatterns=Pattern.compile(tokenPatternsBuffer.substring(1));
//开始匹配令牌
Matcher Matcher=tokenPatterns.Matcher(输入);
while(matcher.find())
{if(matcher.group(TokenType.NUMBER.name())!=null){tokens.add(新令牌(TokenType.NUMBER,matcher.group(TokenType.NUMBER.name())));
继续;
}else if(matcher.group(TokenType.ID.name())!=null){
if(KW.containsValue(matcher.pattern())){
系统输出打印项次(“y”);
添加(新令牌(TokenType.ID,matcher.group(TokenType.ID.name()));
}
否则{
系统输出打印项次(“n”);
add(newToken(TokenType.ID,matcher.group(TokenType.ID.name()));
继续;
}
}
}
}
归还代币;
}
如上所示更正代码


如上所示更正代码。

发布代码,而不是描述代码。这对每个人来说都更简单。看起来像是一些语法错误,因为枚举令牌类型在公共最终字符串模式之前有右大括号。@我已经附加了完整的代码
[…]
中的管道匹配文字管道,如果它在字符类中,则需要删除所有管道。此外,
INCDEC([[++].[-]])
必须定义为
INCDEC(((?:\\+\\+\+\+\-)”)
,因为您希望匹配两个符号序列中的一个。与其描述代码,不如发布它。这对每个人来说都更简单。看起来像是一些语法错误,因为枚举令牌类型在公共最终字符串模式之前有右大括号。@我已经附加了完整的代码
[…]
中的管道匹配文字管道,如果它在字符类中,则需要删除所有管道。此外,
INCDEC([[++].[-]])
必须定义为
INCDEC(((?:\\+\\+\+\+\-)”)
,因为您希望匹配两个符号序列中的一个。问题仍然是相同的问题仍然是相同的
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;
    }
}