Package com.stuffwithstuff.magpie.ast.pattern

Examples of com.stuffwithstuff.magpie.ast.pattern.Pattern


  private static Pattern record(MagpieParser parser) {
    Map<String, Pattern> fields = new HashMap<String, Pattern>();
   
    int index = 0;
    boolean isRecord = false;
    Pattern field = null;
    do {
      String name;
      if (parser.match(TokenType.FIELD)) {
        name = parser.last(1).getString();
        isRecord = true;
View Full Code Here


      return Pattern.value(Expr.nothing(parser.last(1).getPosition()));
    } else if (parser.match(TokenType.STRING)) {
      return Pattern.value(Expr.string(parser.last(1).getString()));
    } else if (parser.match(TokenType.LEFT_PAREN)) {
      // Nested pattern.
      Pattern inner = record(parser);
     
      if (inner == null) {
        throw new ParseException(parser.current().getPosition(),
            "Could not parse primary pattern.");
      }

      parser.consume(TokenType.RIGHT_PAREN);
      return inner;
    } else if (parser.match(TokenType.NAME)) {
      String name = parser.last(1).getString();
      if (name.equals("_")) {
        return Pattern.wildcard();
      } else {
        // Variable pattern, see if it has a pattern after it.
        Pattern pattern = primary(parser);
        if (pattern == null) {
          pattern = Pattern.wildcard();
        }
        return Pattern.variable(name, pattern);
      }
View Full Code Here

    if (patternClass == getClass("RecordPattern")) {
      Map<String, Pattern> fields = new HashMap<String, Pattern>();
      for (Obj field : getList(pattern, "fields")) {
        String name = field.getField(0).asString();
        Pattern fieldPattern = convertPattern(field.getField(1));
        fields.put(name, fieldPattern);
      }
      return Pattern.record(fields);
    } else if (patternClass == getClass("TypePattern")) {
      return Pattern.type(
View Full Code Here

    }
   
    // Pass the block, if any.
    if (parser.match(TokenType.WITH)) {
      // Parse the parameter list if given.
      Pattern blockType;
      if (parser.lookAhead(TokenType.LEFT_PAREN)) {
        blockType = parser.parseFunctionType();
      } else {
        // Else just assume a single "it" parameter.
        blockType = Pattern.variable(Name.IT);
View Full Code Here

  @Override
  public Expr parse(MagpieParser parser, Token token) {
    PositionSpan span = parser.span();
   
    // Parse the pattern if present.
    Pattern pattern = null;
    if (parser.lookAheadAny(TokenType.LEFT_PAREN)) {
      pattern = parser.parseFunctionType();
    } else {
      pattern = Pattern.wildcard();
    }
View Full Code Here

      }
    }

    // Fields that are common to the two cannot disagree on sort order.
    for (String name : intersect) {
      Pattern field1 = record1.get(name);
      Pattern field2 = record2.get(name);
     
      Result compare = compare(field1, scope1, field2, scope2);
      if (compare == Result.NONE) return Result.NONE;
     
      if (lean == Result.SAME) {
View Full Code Here

  Pattern parseFunctionType() {
    // Parse the prototype: (foo Foo, bar Bar)
    consume(TokenType.LEFT_PAREN);
   
    // Parse the parameter pattern, if any.
    Pattern pattern = null;
    if (!lookAhead(TokenType.RIGHT_PAREN)) {
      pattern = PatternParser.parse(this);
    } else {
      // No pattern, so expect nothing.
      pattern = Pattern.nothing();
View Full Code Here

    // Complex receiver:   def (a Int, b Int) sum()
    // Indexer:            def (this String)[index Int]
    // Index setter:       def (this String)[index Int] = (c Char)

    // Parse the left argument, if any.
    Pattern leftArg;
    if (lookAhead(TokenType.LEFT_PAREN)) {
      leftArg = parsePattern();
    } else {
      leftArg = Pattern.nothing();
    }
   
    // Parse the message.
    String name;
    Pattern rightArg;
    if (matchAny(TokenType.NAME,
                 TokenType.ASTERISK,
                 TokenType.SLASH,
                 TokenType.PERCENT,
                 TokenType.PLUS,
                 TokenType.MINUS,
                 TokenType.LT,
                 TokenType.GT,
                 TokenType.LTE,
                 TokenType.GTE,
                 TokenType.EQEQ,
                 TokenType.NOTEQ)) {
      // Regular named message.
      name = last(1).getString();
     
      // Parse the right argument, if any.
      if (lookAhead(TokenType.LEFT_PAREN)) {
        rightArg = parsePattern();
      } else {
        rightArg = Pattern.nothing();
      }
    } else {
      // No name, so it must be an indexer.
      name = "[]";
      consume(TokenType.LEFT_BRACKET);
     
      if (!match(TokenType.RIGHT_BRACKET)) {
        rightArg = PatternParser.parse(this);
        consume(TokenType.RIGHT_BRACKET);
      } else {
        rightArg = Pattern.nothing();
      }
    }
   
    // Parse the setter's rvalue type, if any.
    Pattern setValue = null;
    if (match(TokenType.EQ)) {
      setValue = parsePattern();
    }

    // Combine into a single multimethod pattern.
    Pattern pattern = Pattern.record(leftArg, rightArg);
   
    if (setValue != null) {
      name = Name.makeAssigner(name);
      pattern = Pattern.record(pattern, setValue);
    }
View Full Code Here

 
  private Pattern parsePattern() {
    consume(TokenType.LEFT_PAREN);
    if (match(TokenType.RIGHT_PAREN)) return Pattern.nothing();
   
    Pattern pattern = PatternParser.parse(this);
    consume(TokenType.RIGHT_PAREN);
    return pattern;
  }
View Full Code Here

  private void parseField(boolean isMutable, Map<String, Field> fields) {
    String name = consume(TokenType.NAME).getString();
   
    // Parse the pattern if there is one.
    Pattern pattern;
    if (lookAhead(TokenType.EQ) || lookAhead(TokenType.LINE)) {
      pattern = Pattern.wildcard();
    } else {
      pattern = PatternParser.parse(this);
    }
View Full Code Here

TOP

Related Classes of com.stuffwithstuff.magpie.ast.pattern.Pattern

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.