Pergunta

Parece que os combinadores de pastores de Scala não voltam a voltar. Eu tenho uma gramática (veja o fundo) que não pode analisar o seguinte "STMT" corretamente:

copy in to out .

Isso deve ser fácil de analisar com o retorno:

stmt: (to out(copy in))

Ou eu estou esquecendo de alguma coisa?

Analisador:

type ExprP = Parser[Expr]
type ValueP = Parser[ValExpr]
type CallP = Parser[Call]
type ArgsP = Parser[Seq[Expr]]

val ident     = "[a-zA-Z\\+\\-\\*/%><\\\\\\=]+".r
val sqstart   = "\\["                          .r
val sqend     = "\\]"                          .r
val del       = ","                            .r
val end       = "\\."                          .r

def stmt: ExprP      = expr <~ end
def expr: ExprP      = ucall | call | value
def value: ValueP    = ident ^^ {str => IdentExpr(str)}
def call: CallP      = (args ~ ident ~ expr) ^^ {case args ~ method ~ upon => Call(args, method, upon)}
def ucall: CallP     = (ident ~ expr) ^^ {case method ~ upon => Call(Seq(), method, upon)}
def args: ArgsP      = advargs | smplargs
def smplargs: ArgsP  = expr ^^ {e => Seq(e)}
def advargs: ArgsP   = (sqstart ~> repsep(expr, del) <~ sqend) ^^ {seq => seq}
Foi útil?

Solução

Você quer usar PackratParsers em 2.8. Eu acho que o analisador Packrat é o único analisador de retrocesso.

Editar: em meados do ano de 2015, você deve usar rápido em vez de. Não é apenas muito mais rápido, mas também mais fácil de usar (especialmente ao criar estruturas de dados a partir da análise).

Outras dicas

Seu problema não está voltando atrás. O padrão | operador in scala.util.parsing.combinator fará uma volta. Seu problema é a recursão à esquerda (exprcallargssmplargsexpr). A análise Packrat pode realmente ajudar com isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top