2009-10-06 3 views
3

Я пытаюсь выяснить, как прекратить повторение слов с использованием ключевого слова. Пример:Комбинировщик синтаксического анализатора: как прервать повторение по ключевому слову

class CAQueryLanguage extends JavaTokenParsers { 
    def expression = ("START" ~ words ~ "END") ^^ { x => 
     println("expression: " + x); 
     x 
    } 
    def words = rep(word) ^^ { x => 
     println("words: " + x) 
     x 
    } 
    def word = """\w+""".r 
} 

Когда я исполняю

val caql = new CAQueryLanguage 
caql.parseAll(caql.expression, "START one two END") 

Он печатает words: List(one, two, END), указывая на words анализатор потребляющий END ключевое слово в моем входе, в результате чего выражение парсер не в состоянии соответствовать. Я бы хотел, чтобы END не соответствовал words, что позволит expression успешно разобрать.

+1

JavaTokenParsers не различают идентификаторы и ключевые слова. Я думаю, ответ от agilefall - это то, что вам нужно. –

ответ

4

Это вы что искали?

import scala.util.parsing.combinator.syntactical._ 

object CAQuery extends StandardTokenParsers { 
    lexical.reserved += ("START", "END") 
    lexical.delimiters += (" ") 

    def query:Parser[Any]= "START" ~> rep1(ident) <~ "END" 

    def parse(s:String) = { 
     val tokens = new lexical.Scanner(s) 
     phrase(query)(tokens) 
    } 
} 

println(CAQuery.parse("""START a END"""))  //List(a) 
println(CAQuery.parse("""START a b c END""")) //List(a, b, c) 

Если вы хотите получить более подробную информацию, вы можете проверить this blog post

+0

Спасибо. Вы мудро использовали межтрубки. –