У меня есть рабочий синтаксический анализатор Scala, но решение не так чисто, как хотелось бы. Проблема в том, что некоторые из производств должны рассматривать пробелы как часть токена, но «высокоуровневые» производственные процессы должны иметь возможность игнорировать/пропускать пробелы.Scala Parser, который иногда пропускает пробелы, а иногда и не
Если я использую типичный шаблон анализатора scala для расширения парсеров нижнего уровня, тогда параметры skipWhitespace наследуются, и все становится очень беспорядочным.
Я думаю, мне было бы лучше не использовать подход extends, а скорее иметь экземпляр анализатора низкого уровня, доступный в классе парсеров более высокого уровня, но я не уверен, как это сделать, каждый экземпляр будет видеть только один поток входных символов.
Вот часть парсера низшего уровня -
class VulgarFractionParser extends RegexParsers {
override type Elem = Char
override val whiteSpace = "".r
Тогда я расширяю, что как
class NumberParser extends VulgarFractionParser with Positional {
Но в этот момент NumberParser должен явно обрабатывать пробельные так же, как FractionParser. Для NumberParser это все еще довольно управляемо, но на следующем уровне я действительно хочу иметь возможность просто определять производные, которые будут использовать пробелы в качестве разделителя, как это сделал бы обычный regexParser.
Примером может быть что-то вроде:
IBM 33.33/ 1200.00
or
IBM 33.33/33.50 1200.00
2-е значение иногда состоит из двух частей, разделенных символом «/», а иногда только имеет одну часть ни с чем после косой черты (или даже не содержащие слэш вообще).
def bidOrAskPrice = ("$"?) ~> (bidOrAskPrice1 | bidOrAskPrice2 | bidOrAskPrice3)
def bidOrAskPrice1 = number ~ ("/".r) ~ number ~ (SPACES) ^^ {
case a ~ slash ~ b ~ sp1 => BidOrAsk(a,Some(b))
}
def bidOrAskPrice2 = (number ~ "/" ~ (SPACES)) ^^ { case a ~ slash ~ sp => BidOrAsk(a,None) }
def bidOrAskPrice3 = (number ~ (SPACES?)) ^^ { case a ~ sp => BidOrAsk(a , None)}
Можете ли вы привести несколько примеров производств, которые должны учитывать пробелы и некоторые примеры производств, которые не должны учитывать пробелы? – sarnold
обновил вопрос с примера данных и одного из элементов, чувствительных к пробелу. – malsmith