8

Considere esta parte de la gramática:¿Cómo cambiar el código usando los Combinadores Scala Parser para tener en cuenta la prioridad del operador?

def expression = SimpleExpression ~ opt(relation ~ SimpleExpression) 
    def relation = "=" | "#" | "<=" | "<" | ">=" | ">" | "IN" | "IS" 
    def SimpleExpression = opt("+" | "-") ~ rep1sep (term, AddOperator) 
    def AddOperator = "+" | "-" | "OR" 
    def term = factor ~ rep(MulOperator ~ factor) 
    def MulOperator = "*" | "/" | "DIV" | "MOD" | "&" 
    def factor: Parser[Any] = number | "(" ~ expression ~ ")" | "~" ~ factor 

¿Es necesario volver a escribir partes de él para crear nuevas reglas, o hay sólo un método (como | vs ||| para el primer juego frente a más largo regla) I Actualmente estoy perdido, ¿qué hace lo necesario?

+1

¿Cuál es su problema concreto? – ziggystar

Respuesta

5

La precedencia del operador es un resultado natural de la forma en que se escriben las reglas. Por ejemplo, en esta gramática a SimpleExpression se compone de suma, resta y lógica -o de term, y term se compone de multiplicación, división, módulo y lógica- y de factor.

Así que si usted tiene esto:

1 + 2 * 3 

Usted obtendrá la siguiente vuelta (en términos generales, para mayor claridad):

List(1, (2 ~ List(* ~ 3))) 

Y si usted tiene esto:

1 * 2 + 3 

Lo recuperarás (en términos generales):

List((1 ~ List(* ~ 2)), 3) 

Se pierden los operadores adicionales debido a rep1sep - los separadores se descartan.

Cuestiones relacionadas