elparser.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 883 行 · 第 1/2 页

JAVA
883
字号
      }            case '(':      {        ArrayList<Expr> argList = new ArrayList<Expr>();        int ch = skipWhitespace(read());        while (ch > 0 && ch != ')') {          unread();          argList.add(parseExpr());                    token = scanToken();                    if (token != ',') {            ch = token;            break;          }                    ch = skipWhitespace(read());        }        	if (ch != ')')	  throw error(L.l("Expected `)' at {0}.  All functions must have matching closing parenthesis.", badChar(ch)));        // token = scanToken();        Expr []args = (Expr []) argList.toArray(new Expr[argList.size()]);	Expr expr = term.createMethod(args);        if (expr == null)	  throw error(L.l("Method call not supported in this context `{0}'.",                          term));        term = expr;        break;      }      case '.':      {        int ch = skipWhitespace(read());                if (! Character.isJavaIdentifierStart((char) ch))	  throw error(L.l("Expected `]' at {0}.  Field references must be identifiers.", badChar(ch)));        String field = readName(ch);        term = term.createField(field);        break;      }              default:        _peek = token;        return term;      }    }  }  /**   * simple-term ::= number   *             ::= '(' expr ')'   *             ::= variable   *             ::= '"' string '"'   *             ::= true | false | null   */  private Expr parseSimpleTerm()    throws ELParseException  {    int ch = read();        ch = skipWhitespace(ch);    switch (ch) {    case '.':    case '0': case '1': case '2': case '3': case '4':    case '5': case '6': case '7': case '8': case '9':      {	long value = 0;	double exp = 1;        int digits = 0;	for (; ch >= '0' && ch <= '9'; ch = read())	  value = 10 * value + ch - '0';        if (ch != '.' && ch != 'e' && ch != 'E') {          unread();          return new LongLiteral(value);        }        	if (ch == '.') {	  for (ch = read(); ch >= '0' && ch <= '9'; ch = read()) {	    value = 10 * value + ch - '0';	    exp *= 10;            digits--;	  }	}        if (ch == 'e' || ch == 'E') {          int sign = 1;          int expValue = 0;                    ch = read();          if (ch == '-') {            sign = -1;            ch = read();          }          else if (ch == '+')            ch = read();                    for (; ch >= '0' && ch <= '9'; ch = read())            expValue = 10 * expValue + ch - '0';          exp = Math.pow(10, digits + sign * expValue);          unread();                    return new DoubleLiteral((double) value * (double) exp);        }        	unread();	return new DoubleLiteral((double) value / (double) exp);      }    case '-':      return new MinusExpr(parseTerm());    case '!':      return UnaryExpr.create(Expr.NOT, parseTerm());    case '+':      return parseTerm();    case '(':      {	Expr expr = parseExpr();	if ((ch = scanToken()) != ')')	  throw error(L.l("Expected `)' at {0}.  All open parentheses must have matching closing parentheses.", badChar(ch)));		return expr;      }    case '\'': case '"':      {	int end = ch;	CharBuffer cb = new CharBuffer();        for (ch = read(); ch >= 0; ch = read()) {          if (ch == '\\')            cb.append((char) read());          else if (ch != end)            cb.append((char) ch);          else if ((ch = read()) == end)            cb.append((char) ch);          else {            unread();            break;          }        }	return new StringLiteral(cb.toString());      }    default:      if (! Character.isJavaIdentifierStart((char) ch) && ch != ':')	throw error(L.l("Unexpected character at {0}.", badChar(ch)));            CharBuffer cb = CharBuffer.allocate();      for (;           Character.isJavaIdentifierPart((char) ch) || ch == ':';           ch = read())        cb.append((char) ch);      unread();      String name = cb.close();      if (name.equals("null"))        return new NullLiteral();      else if (name.equals("true"))        return new BooleanLiteral(true);      else if (name.equals("false"))        return new BooleanLiteral(false);      else if (name.equals("not"))        return UnaryExpr.create(Expr.NOT, parseTerm());      else if (name.equals("empty"))        return UnaryExpr.create(Expr.EMPTY, parseTerm());      else {	VariableMapper varMapper = _elContext.getVariableMapper();		ValueExpression valueExpr = null;	if (varMapper != null)	  valueExpr = varMapper.resolveVariable(name);	if (valueExpr != null)	  return new ValueExpr(name, valueExpr);	        Expr expr = createImplicitObjectExpr(name);        if (expr != null)          return expr;	try {	  Method method = getStaticMethod(name);	  if (method != null)	    return new StaticMethodExpr(method);	  else	    return new IdExpr(name);	} catch (Exception e) {	  log.log(Level.FINEST, e.toString(), e);	  	  return new IdExpr(name);	}      }    }  }  /**   * Creates the implicit object for the name.   */  protected Expr createImplicitObjectExpr(String name)  {    return null;  }  /**   * Creates the implicit object for the name.   */  protected Method getStaticMethod(String name)    throws ELParseException  {    Method method = null;    FunctionMapper funMapper = _elContext.getFunctionMapper();    if (funMapper != null) {      String prefix = "";      String localName = name;      int p = name.indexOf(':');      if (p > 0) {	prefix = name.substring(0, p);	localName = name.substring(p + 1);      }            method = funMapper.resolveFunction(prefix, localName);    }        return method;  }  /**   * Scans the next token.   *   * @return token code, expressed as an Expr enumeration.   */  private int scanToken()    throws ELParseException  {    if (_peek >= 0) {      int value = _peek;      _peek = -1;      return value;    }    int ch = skipWhitespace(read());    switch (ch) {    case '+': return Expr.ADD;    case '-': return Expr.SUB;    case '*': return Expr.MUL;    case '/': return Expr.DIV;    case '%': return Expr.MOD;    case '!':      ch = read();      if (ch == '=')	return Expr.NE;      else        return Expr.NOT;          case '=':      ch = read();      if (ch == '=')	return Expr.EQ;      else	throw error(L.l("expected '==' at '={0}'", badChar(ch)));          case '&':      ch = read();      if (ch == '&')	return Expr.AND;      else	throw error(L.l("expected '&&' at '&{0}'", badChar(ch)));          case '|':      ch = read();      if (ch == '|')	return Expr.OR;      else	throw error(L.l("expected '||' at '|{0}'", badChar(ch)));    case '<':      ch = read();      if (ch == '=')	return Expr.LE;      else {	unread();	return Expr.LT;      }    case '>':      ch = read();      if (ch == '=')	return Expr.GE;      else {	unread();	return Expr.GT;      }    case '[':      return '[';          case ']':      return ']';          case ')':      return ')';          case '(':      return '(';          case '.':      return '.';          case ',':      return ',';          case '?':    case ':':      return ch;    default:      if (Character.isJavaIdentifierStart((char) ch)) {	String name = readName(ch);	if (name.equals("div"))	  return Expr.DIV;	else if (name.equals("mod"))	  return Expr.MOD;	else if (name.equals("eq"))	  return Expr.EQ;	else if (name.equals("ne"))	  return Expr.NE;	else if (name.equals("lt"))	  return Expr.LT;	else if (name.equals("le"))	  return Expr.LE;	else if (name.equals("gt"))	  return Expr.GT;	else if (name.equals("ge"))	  return Expr.GE;	else if (name.equals("and"))	  return Expr.AND;	else if (name.equals("or"))	  return Expr.OR;	else	  throw error(L.l("expected binary operation at `{0}'", name));      }      unread();      return -1;    }  }  private String readName(int ch)  {    CharBuffer cb = CharBuffer.allocate();    for (; Character.isJavaIdentifierPart((char) ch); ch = read())      cb.append((char) ch);    unread();    return cb.toString();  }  /**   * Skips whitespace, returning the next meaningful character.   */  private int skipWhitespace(int ch)    throws ELParseException  {    for (; ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'; ch = read()) {    }    return ch;  }  /**   * Reads the next character, returning -1 on end of file.   */  private int read()  {    if (_index < _string.length())      return _string.charAt(_index++);    else {      _index++;      return -1;    }  }  /**   * Unread the last character.   */  private void unread()  {    _index--;  }  /**   * Returns a readable version of the character.   */  private String badChar(int ch)  {    if (ch < 0)      return L.l("end of file");    else if (ch == '\n')      return L.l("end of line");    else      return "`" + (char) ch + "'";  }  /**   * Returns an new exception.   */  private ELParseException error(String message)  {    return new ELParseException(message + " in " + _string);  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?