Skip to content

Commit

Permalink
=~ match operator
Browse files Browse the repository at this point in the history
  • Loading branch information
prakashk committed May 17, 2013
1 parent 499757b commit 4252c2c
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 2 deletions.
2 changes: 2 additions & 0 deletions src/main/scala/org/moe/ast/AST.scala
Expand Up @@ -139,3 +139,5 @@ case class ForeachNode(topic: AST, list: AST, body: StatementsNode) extends AST
case class ForNode(init: AST, condition: AST, update: AST, body: StatementsNode) extends AST

case class RegexLiteralNode(rx: String) extends AST
case class RegexMatchNode(target: AST, pattern: AST, flags: AST) extends AST
case class RegexSubstNode(target: AST, pattern: AST, replacement: AST, flags: AST) extends AST
19 changes: 18 additions & 1 deletion src/main/scala/org/moe/interpreter/guts/Operators.scala
Expand Up @@ -45,5 +45,22 @@ object Operators extends Utils {
val argFalse = new MoeLazyEval(i, env, falseExpr)
callMethod(receiver, "infix:<?:>", List(argTrue, argFalse))
}

// regex operations

case (env, RegexMatchNode(target: AST, pattern: AST, flags: AST)) => {
val receiver = i.evaluate(env, target)
val argPattern = i.evaluate(env, pattern)
val argFlags = i.evaluate(env, flags);
callMethod(receiver, "match", List(argPattern, argFlags))
}

case (env, RegexSubstNode(target: AST, pattern: AST, replacement: AST, flags: AST)) => {
val receiver = i.evaluate(env, target)
val argPattern = i.evaluate(env, pattern)
val argReplacement = i.evaluate(env, replacement)
val argFlags = i.evaluate(env, flags);
callMethod(receiver, "subst", List(argPattern, argReplacement, argFlags))
}
}
}
}
2 changes: 2 additions & 0 deletions src/main/scala/org/moe/parser/MoeLiterals.scala
Expand Up @@ -69,6 +69,8 @@ trait MoeLiterals extends JavaTokenParsers {
// Regex Literal

def regexString = """(\\.|[^/])*""".r

// TODO: support for other delimiters
def regexLiteral: Parser[RegexLiteralNode] = "/" ~> regexString <~ "/" ^^ { rx => RegexLiteralNode(rx) }

def literalValue: Parser[AST] = (
Expand Down
20 changes: 19 additions & 1 deletion src/main/scala/org/moe/parser/MoeProductions.scala
Expand Up @@ -74,7 +74,6 @@ trait MoeProductions extends MoeLiterals with JavaTokenParsers with PackratParse
case left ~ op ~ right => BinaryOpNode(left, op, right)
} | expOp

// TODO: left =~ !~
// TODO: right ! ~ \ and unary + and -

// This one is right-recursive (associative) instead of left
Expand Down Expand Up @@ -281,6 +280,24 @@ trait MoeProductions extends MoeLiterals with JavaTokenParsers with PackratParse
case hash ~ key_exprs ~ "=" ~ value_expr => HashElementLvalueNode(hash, key_exprs, value_expr)
}

/**
* regex match/substitution etc
*/

lazy val regexModifiers: Parser[AST] = """[igsmx]*""".r ^^ { flags => StringLiteralNode(flags) }

def matchExpression: Parser[AST] = (simpleExpression <~ "=~") ~ ("m".? ~> regexLiteral) ~ regexModifiers ^^ {
case target ~ pattern ~ flags => RegexMatchNode(target, pattern, flags)
}

def substExpression: Parser[AST] = (simpleExpression <~ "=~") ~ ("s" ~> regexLiteral) ~ expression ~ regexModifiers ^^ {
case target ~ pattern ~ replacement ~ flags => RegexSubstNode(target, pattern, replacement, flags)
}

// TODO: tr (transliteration) operator

def regexExpression = (matchExpression | substExpression)

/**
*********************************************************************
* Now we are getting into statements,
Expand Down Expand Up @@ -468,6 +485,7 @@ trait MoeProductions extends MoeLiterals with JavaTokenParsers with PackratParse
lazy val simpleStatement: Parser[AST] = (
variableDeclaration
| multiVariableDeclaration
| regexExpression
| variableAssignment
| multiVariableAssignment
| attributeAssignment
Expand Down

0 comments on commit 4252c2c

Please sign in to comment.