我希望在 Scala 中编写一个基本的解析器。几年前,我参与了一个java项目,在该项目中,我们为税收计算创建了一个财务解析器。
以下是我要解析的文本:
1)使用相等,逻辑运算符的基本表达式 2)条件仅限于IF,AND,OR 3)在控制台上打印的字符串类型的结果。
例如“IF X =='text'和Y == 2 Result SUCCESS”
我从“Scala编程”中读过Scala Combinator解析器,得到了一些想法。想要了解基于我的要求创建语法的过程。
根据我的阅读,我认为我需要很少的摘要来制作一种语言
1)表达式语法
2)运算符语法
3)文字/标记语法
从我认为它应该具有的初始代码中添加:
class BasicParser extends JavaTokenParsers{
def literals : Parser[Any] = stringLiteral| floatingPointNumber | "null" | decimalNumber
def conditions: Parser[Any] = "["~repsep(literals, "AND") | repsep(literals, "OR")~"]"
//added later
def expression: Parser[Any] = "["~repsep(literals, conditions) ~"]"
}
我还需要为此解析器创建语法吗?
更新:好的,我回到了绘图板并考虑了解决这个问题的正确方法。
对于要定义的任何解析器,我们需要定义它将具有的标记。 那么我们应该定义运算符是否有,如果有的话。 然后我们应该定义表达式来表示令牌和运算符将以何种形式存在。
以下是基于这些要点更新的代码,我仍然认为这里存在一些差距。
class BasicParser extends JavaTokenParsers{
def literals : Parser[Any] = stringLiteral | floatingPointNumber | decimalNumber
def conditions: Parser[(String, String)=> Boolean] = ("AND" | "OR" | "IF") ^^ {
case "AND" => AND
case "OR" => OR
case "IF" => IFExpr
}
def AND(s1: String, s2:String): Boolean = {
// convert text and use AND ( && )
false
}
def OR(s1: String, s2:String):Boolean= {
// convert text and use OR( || )
false
}
def IFExpr(s: String, x: String): Boolean={
// convert s into condition
if(s)
true
else
false
}
def expression: Parser[Any] = literals | conditions
}