Альтернатива rep1sep в комбинаторе синтаксического анализатора - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь написать что-то вроде этого: andExpr - это orExpr, разделенный "и". Если он не разделен символом «и», он должен восприниматься как буквальный, а не как orExpr.

Итак, если я сделаю:

def andExpr: Parser[Expr] = rep1sep(orExpr, "and") ^^{ 
  //omitting the transformation function 
} | literal

Предположим, что каждое выражение является andExpr. Я хочу, чтобы выражение было orExpr, только если оно разделено "и". Например, если вход «hello and hi», в этом случае «hello» - это один orExpr, а «hi» - один orExpr. Но прямо сейчас (существующий код, который я написал) каждый andExpr по умолчанию является orExpr. Итак, прямо сейчас, если вход «пока», это также orExpr. Но я хочу, чтобы "пока" квалифицировалось как буквальное, а не как orExpr.

Как я могу это сделать?

1 Ответ

0 голосов
/ 26 мая 2018

Мы можем сделать это, используя сложные операторы case.

Например:

def andExpr: Parser[Expr] = rep1sep(orExpr, "and") ^^{ 
  case terms: if(terms.length == 1) {
                   terms.head . //treating like literal
               } else {
                  //required expression
               }

}
...