解析搜索表达式上的括号-Scala解析器组合器

解析搜索表达式上的括号-Scala解析器组合器,scala,parsing,lexer,Scala,Parsing,Lexer,我正在为搜索表达式编写解析器。 前 a=“zyx”和(b9) 我编写了此解析器,但它无法匹配括号,出现以下错误: failure: identifier expected a = "zyx" and ( b < 5 or c > 9) ^ 失败:需要标识符 a=“zyx”和(b9) ^ 我能做些什么来匹配这些论题 class SearchQueryParser扩展了StandardTokenParser{ def expr:Parser[Expres

我正在为搜索表达式编写解析器。 前

a=“zyx”和(b<5或c>9)
我编写了此解析器,但它无法匹配括号,出现以下错误:

failure: identifier expected
a = "zyx" and ( b < 5 or c > 9)
              ^
失败:需要标识符
a=“zyx”和(b<5或c>9)
^
我能做些什么来匹配这些论题

class SearchQueryParser扩展了StandardTokenParser{
def expr:Parser[Expression]=orExp |“(“~>orExp~”)
def orExp:解析器[表达式]={
andExp*(“或”^^^{(a:表达式,b:表达式)=>BoolExp(“或”,(a,b))})
}
def andExp:解析器[表达式]={
compareExp*(“and”^^^{(a:Expression,b:Expression)=>BoolExp(“and”,(a,b))})
}
def compareExp:解析器[表达式]={
标识符~rep(
(“=”|“!=”|“)~literal^^{
案例op~rhs=>(op,rhs)
}
) ^^ {
大小写(acc,(“=”,rhs:表达式))=>二项式(“=”,acc,rhs)
大小写(acc,(“!=”,rhs:表达式))=>二项式(“!=”,acc,rhs)
案例(acc,(“”,acc,rhs)
}
}
}

您当前的语法只允许在
expr
规则中使用括号,我假设这是您的主要规则,
expr
规则从未被任何其他规则使用过。因此,括号只允许出现在整个表达式周围


您要做的是将
“(“~expr~”)
放在允许使用括号表达式的最低位置。我理解您的语法,这可能意味着允许它作为
中的
compareExp
的替代方法(假设您不希望在
compareExp
中使用括号).

正如@sepp2k所提到的,您需要将括号放在允许使用括号的最低位置。在您的情况下,它应该位于compareExp中:

def compareExp:Parser[表达式]={
(“~>expr(op,rhs)
}
) ^^ {
大小写(acc,(“=”,rhs:表达式))=>二项式(“=”,acc,rhs)
大小写(acc,(“!=”,rhs:表达式))=>二项式(“!=”,acc,rhs)
案例(acc,(“”,acc,rhs)
}
}
exp
方法不应处理括号

def expr:Parser[Expression]=orExp

你的
compareExp
规则对我来说很奇怪。它允许
x<5>1
,但不允许
1
。我不确定这是否是你想要的。谢谢你的评论。实际上,我不需要任何表达式,因为只允许使用双引号。我相应地更改了语法。
failure: identifier expected
a = "zyx" and ( b < 5 or c > 9)
              ^