string - In which situation stringLit in StandardTokenParsers doesn't work? -


i writing parser in arithmetic operation going parsed. arithmetic operation contains variables instance: var1+1

the parser follow:

   package org.pvamu.hadoop.image;    import org.apache.spark.serializer.{kryoserializer, kryoregistrator}    import java.nio.file.files;    import java.io.file;    import scala.util.parsing.combinator.lexical._    import scala.util.parsing.combinator.token.stdtokens    import scala.util.parsing.combinator.lexical.stdlexical    import scala.util.matching.regex    import scala.util.parsing.combinator.syntactical._    import scala.util.parsing.combinator._     abstract class expr {          def rpn:string    }    case class binaryoperator(lhs:expr, op:string, rhs:expr) extends expr {        def rpn:string = lhs.rpn + " " + rhs.rpn + " " + op    }     case class number(v:string) extends expr { def rpn:string = v }    case class variable(v:string) extends expr { def rpn:string = v }    case class function(f:string, e:list[expr]) extends expr { def rpn:string    = {        var s = ""        e.foreach { x => s += x.rpn + " " }        s += f        return s     }   }      class parseexp extends standardtokenparsers {        lexical.delimiters ++= list("+","-","*","/","^","(",")",",")        def value :parser[expr] = numericlit ^^ { s => number(s) }        def variable:parser[expr] =  stringlit ^^ { s => variable(s) }        def parens:parser[expr] = "(" ~> expr <~ ")"        def argument:parser[expr] = expr <~ (","?)        def func:parser[expr] = ( stringlit ~ "(" ~ (argument+) ~ ")" ^^ { case f ~ _ ~ e ~ _ => function(f, e) })        def term = (value | parens | func | variable)         def pow :parser[expr] = ( term ~ "^" ~ pow ^^ {case left ~ _ ~ right => binaryoperator(left, "^", right) }|             term)        def factor = pow * ("*" ^^^ { (left:expr, right:expr) => binaryoperator(left, "*", right) } |                     "/" ^^^ { (left:expr, right:expr) => binaryoperator(left, "/", right) } )        def sum =  factor * ("+" ^^^ { (left:expr, right:expr) => binaryoperator(left, "+", right) } |                     "-" ^^^ { (left:expr, right:expr) => binaryoperator(left, "-", right) } )        def expr = ( sum | term )           def parse(s:string) = {           val tokens = new lexical.scanner(s)           phrase(expr)(tokens)         }            def runparser(exprstr: string) : string = exprstr match {                    case null => return ""                    case "" => return ""                    case _ =>                       parse(exprstr) match {                             case success(tree, _) =>                             println("tree: "+tree)                             val v = tree.rpn                             println("rpn: "+v)                             return v                     case e: nosuccess => console.err.println(e)                          return e.tostring          }        }     }  object calculator extends infixtopostfix {       def main(args: array[string]) {       println("input : "+ args(0))       println(runparser(args(0)))     }  } 

then input send : "3+j" , gives me error saying:

   failure: string literal expected     3+j      ^ 

i don't know part wrong?! going parse path , actual problem here realized program not able parse little string, don't know it!


Comments

Popular posts from this blog

PHP DOM loadHTML() method unusual warning -

python - How to create jsonb index using GIN on SQLAlchemy? -

c# - TransactionScope not rolling back although no complete() is called -