Как объединить Regexp и ключевые слова в комбинаторах парсера Scala - PullRequest
3 голосов
/ 22 сентября 2010

Я видел два подхода к созданию парсеров в Scala.

Первый - это расширение от RegexParsers и определение ваших выигранных лексических паттернов.Проблема, с которой я сталкиваюсь, заключается в том, что я не совсем понимаю, как она справляется с неопределенностью ключевых слов.Например, если мое ключевое слово совпадает с шаблоном идентификаторов, то оно обрабатывает ключевые слова как идентификаторы.

Чтобы противостоять этому, я видел сообщения типа этот , в которых показано, как их использовать.StandardTokenParsers для указания ключевых слов.Но тогда я не понимаю, как определить шаблоны регулярных выражений!Да, StandardTokenParsers поставляется с «идентами», но не с другими, которые мне нужны (сложные представления чисел с плавающей запятой, конкретные строковые литеральные шаблоны и правила для экранирования и т. Д.).

Как получить обавозможность задавать ключевые слова и возможность указывать шаблоны токенов с регулярными выражениями?

1 Ответ

8 голосов
/ 22 сентября 2010

Я написал только парсеры RegexParsers, но я делаю что-то вроде этого:

val name: Parser[String] = "[A-Z_a-z][A-Z_a-z0-9]*".r

val kwIf: Parser[String]    = "if\\b".r
val kwFor: Parser[String]   = "for\\b".r
val kwWhile: Parser[String] = "while\\b".r

val reserved: Parser[String] = ( kwIf | kwFor | kwWhile )

val identifier: Parser[String] = not(reserved) ~> name
...