8

문법의이 부분을 고려Scala Parser Combinators를 사용하여 연산자 우선 순위를 고려하여 코드를 변경하는 방법은 무엇입니까?

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 

이 필요한 새로운 규칙을 만들 그것의 부분을 재 작성하는 것입니다, 아니면 그냥하는 방법이있다 (같은 첫 대 가장 긴 규칙 매칭을위한 ||||) I 현재 실종 된 것이 필요한 것입니까?

+1

구체적인 문제는 무엇입니까? – ziggystar

답변

5

운영자 우선 순위는 규칙 작성 방법의 자연스러운 결과입니다. 예를 들어,이 문법에서 SimpleExpression은 더하기, 빼기 및 논리 - 또는 term으로 구성되고 term은 곱셈, 나누기, 모듈러스 및 논리로 구성되며 factor입니다.

그래서 당신은 할 경우이 :

1 + 2 * 3 

당신은 얻을거야 (약 명확성을 위해, 말하기) 다시 다음

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

을 그리고 당신이있는 경우 :

1 * 2 + 3 

다음과 같이 표시됩니다 (대략 말하기) :

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

rep1sep 때문에 분리 연산자가 없어져 구분 기호가 삭제됩니다.

관련 문제