2013-04-17 5 views
2

Я пытаюсь разобрать некоторые данные, которые отформатированы следующим образом.Использование вложенного правила с parse

data: [a b x b x x b a a x x b b x ] 

Что мне нужно, чтобы извлечь коэффициенты а и Ь, с тем и выполнять различные действия для каждого а и Ь.

Ожидаемый результат будет:

a 
b 
b 
b 
a 
a 
b 
b 
== true 

Я пришел с этим до сих пор, но она не за неоднократное в.

parse data [ 
    some [ 
    thru 'a (print "a") 
    some [ 
     any [ 
     to 'b (print "b") 
     ] 
     to 'a 
    ] 
    ] 
    to end 
] 

Любые указатели? Благодаря

ответ

4
>> data: [a b x b x x b a a x x b b x ] 
== [a b x b x x b a a x x b b x] 

>> parse data [ some [ 'a (print "a") | 'b (print "b") | skip ] ] 
a 
b 
b 
b 
a 
a 
b 
b 
== true 
4

Я может быть что-то отсутствует ... но это не то, что вы хотите просто:

parse data [ 
    any [ 
     thru ['a (print "a") | 'b (print "b")] 
    ] 
    to end 
] 

Это формирует выходной сигнал вы спрашиваете.

+0

Благодарим вас, вы правы. Я застрял, думая, как данные были структурированы как 'a' _followed_ на 0 или более' b'. Ваше решение является более аккуратным, поскольку на самом деле просто говорит, что если я получу 'a', сделайте это, или если я получу' b', сделайте это, и порядок будет неявным, так как синтаксический анализ перемещается вперед через серию. – johnk

+0

Конечно. @ GrahamChiu немного лучше! – HostileFork

+1

На самом деле, это намного лучше в Rebol 3. Грэхем будет работать в Rebol 2. – BrianH

3

Это to и thru, они вам в действительности не нужны. Давайте воспользуемся R3 здесь и обойдемся.

parse data [ 
    some [ 
     'a (print "a") 
     any [ 
      'b (print "b") | 
      and 'a break | 
      skip 
     ] 
    ] 
    to end 
] 

and делает предпросмотр, и break разразится из any правила. Это позволяет остановить внутренний цикл, когда вы достигнете начала следующего.

to и thru будет пропускать мимо вещи, которые вы не хотите пропустить мимо, и в случае to 'b в вашем коде не делает ничего большую часть времени. Вам повезло, что цикл any, который вы завернули в to 'b, был изменен в R3, чтобы не продолжить, если он не продвинулся, потому что он не продвигался вперед.

Что касается вашей первой проблемы, внутренний some после (print "a") должен был быть any, чтобы сделать его необязательным. some не был необязательным, поэтому он не работал для прогонов a без промежуточных данных.

PARSE может быть сложным, но вы можете повесить его.

+0

Спасибо Брайан, очень четкое объяснение. Я раньше не видел «и». Являются ли документы здесь самыми последними источниками информации о 'parse'? Http: //www.rebol.com/r3/docs/functions/parse.html – johnk

+0

Другие ответы будут работать, но не делают вложенные поэтому они не отвечают на ваш вопрос.Тем не менее, если вам действительно не нужно знать, как делать вложенные циклы, тогда они будут работать! – BrianH

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

  • Нет связанных вопросов^_^