Skip to content

Instantly share code, notes, and snippets.

@wbars
Created January 7, 2016 07:37
Show Gist options
  • Save wbars/eab995862b3b7e8185b5 to your computer and use it in GitHub Desktop.
Save wbars/eab995862b3b7e8185b5 to your computer and use it in GitHub Desktop.
package parser
import lexical.tokens.Token
import lexical.tokens.cond.Operator._
import lexical.tokens.cond.OperatorToken
import parser.utils.Tree
/**
* Created by wannabe on 05.01.16.
*/
sealed trait NonTerminal {
def evaluate(tokens: BufferedIterator[Option[Token[_]]]): Tree[Token[_]]
}
case object Expression extends NonTerminal {
override def evaluate(tokens: BufferedIterator[Option[Token[_]]]): Tree[Token[_]] = {
val tree: Tree[Token[_]] = new Tree(None, None, None)
tree.l = Some(SimpleExpression.evaluate(tokens))
tree.v = tokens.next()
tree.r = Some(SimpleExpression.evaluate(tokens))
tree
}
}
case object SimpleExpression extends NonTerminal {
override def evaluate(tokens: BufferedIterator[Option[Token[_]]]): Tree[Token[_]] = {
val tree: Tree[Token[_]] = new Tree(None, None, None)
if (tokens.hasNext) {
tree.v = tokens.next()
if (tokens.hasNext) {
tokens.head.get match {
case operator: OperatorToken => operator.value match {
case PLUS | MINUS | MULTIPLY | DIVIDE =>
tree.l = Some(new Tree[Token[_]](tree.v, None, None))
tree.v = tokens.next()
tree.r = Some(SimpleExpression.evaluate(tokens))
case none =>
}
}
}
}
tree
}
}
object Parser {
def parse(tokens: BufferedIterator[Option[Token[_]]]): Tree[Token[_]] = {
Expression.evaluate(tokens)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment