2012-05-30 4 views
6

У меня есть рабочий синтаксический анализатор 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)} 
+0

Можете ли вы привести несколько примеров производств, которые должны учитывать пробелы и некоторые примеры производств, которые не должны учитывать пробелы? – sarnold

+0

обновил вопрос с примера данных и одного из элементов, чувствительных к пробелу. – malsmith

ответ

2

ли не больше смысла, чтобы превратить первый парсер в лексемы синтаксического анализатора (Лексический анализатор, на самом деле), и сделать второй синтаксический анализатор для чтения, что вместо простой Char?

+1

Я не видел примера такого подхода, но это похоже на то, что я хочу. – malsmith

Смежные вопросы