Scala Parser Combinators ‹~ ~›игнорира всички предишни изрази

Използвам комбинатора за анализатор на scala за извличане на идентификатори ("a" и "ACCOUNT_ID") във входния низ. Когато използвам ~>, той игнорира всички предишни части на низа вместо непосредствения предшестващ низ. Може ли някой да ми помогне с извличането на 2 идентификатора от входния низ с помощта на Scala Parser Combinators? Оценявам помощта ти

class QParser extends JavaTokenParsers with RegexParsers {
def join: Parser [Any] = opt(ident) ~ (opt("(")) ~ ident ~ "." ~> ident <~     opt(",") <~ ident <~ opt(")") 
}

object QueryParser extends QParser {
def main(args: Array[String]){
     println(parseAll(join,"convert(a.ACCOUNT_ID, string)"))
}

}


person Sathish    schedule 16.07.2015    source източник


Отговори (1)


Инфиксните оператори, които не завършват с :, са ляво-асоциативни, така че a ~ b ~> c се поставя в скоби като (a ~ b) ~> c. Ако искате нещо друго, трябва сами да добавите скоби.

В този случай искате opt("(")) ~ ident ~ ("." ~> ident) <~ ..., така че само "." да е левият операнд на ~>.

person sepp2k    schedule 16.07.2015
comment
Разбрах го и работи перфектно. Възможно ли е да се предостави решение с помощта на :. Не можах да получа контекста на използване на : в комбинатори. - person Sathish; 16.07.2015
comment
@Sathish Бихте ли изяснили какво имате предвид с това? - person sepp2k; 16.07.2015
comment
Въпросът ми е как да: в комбинатори за анализатор. Между другото, срещам проблем при предаване на низ a.ACCOUNT_ID вместо convert(a.ACCOUNT_ID, низ) за def joinExp: Parser[Any] = opt(ident) ~> opt("(") ~> ident ~ ("." ~> ident <~ opt(",") <~ ident <~ opt(")")) при получаване на грешка [1.32] грешка: низ, съответстващ на регулярен израз \p{javaJavaIdentifierStart}\p{javaJavaIdentifierPart}*' expected but .' намерени - person Sathish; 16.07.2015
comment
@Sathish Страхувам се, че това не направи въпроса ви по-ясен за мен. Питате как да използвате двоеточие като част от анализирания синтаксис? Същото, което правиш с. и , сега: просто пишете : където имате нужда. Или питате кои типове трябва да имат вашите анализатори (т.е. какво трябва да върви след : във вашия Scala код)? Parser[T] където T е типът, който искате да бъде вашият резултат. - person sepp2k; 16.07.2015
comment
@Sathish Относно втория ви въпрос: След като добавих скобите, както предложих, вашият код работи добре за мен. Отпечатва [1.30] parsed: (((Some(convert)~Some(())~a)~ACCOUNT_ID). - person sepp2k; 16.07.2015
comment
Благодаря ти. Работи. Моя грешка. Не го изразих правилно. Препоръчвате ли някои връзки, където мога да науча за комбинаторите за анализатори на scala? Не можах да намеря много в гугъл.. - person Sathish; 17.07.2015