8

Rozważmy tę część gramatyki:Jak zmienić kod za pomocą łączników Scala Parser, aby uwzględnić pierwszeństwo operatorów?

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 

Czy konieczne jest przepisanie jego części do tworzenia nowych reguł, czy też istnieje tylko sposób (jak | vs. ||| dla pierwszego vs. najdłuższego dopasowania reguły) I aktualnie brakuje, co robi to, co konieczne?

+1

Jaki jest twój konkretny problem? – ziggystar

Odpowiedz

5

Pierwszeństwo operatora jest naturalnym wynikiem sposobu, w jaki reguły są zapisywane. Na przykład w tej gramatyce SimpleExpression składa się z dodawania, odejmowania i logicznego - lub term, a term składa się z mnożenia, dzielenia, modułu i logicznej - oraz z factor.

Więc jeśli masz to:

1 + 2 * 3 

Dostaniesz następujące tyłu (z grubsza rzecz biorąc, dla jasności):

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

A jeśli masz to:

1 * 2 + 3 

Dostaniesz to z powrotem (w przybliżeniu):

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

Tracisz operatorów dodawania z powodu rep1sep - separatory są odrzucane.

Powiązane problemy