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
Post a Comment