Альтернативные правила в PARSE только с SKIP не дали ожидаемых результатов

Я обнаружил фрагмент кода:

blk: [1 #[none] 2 #[none] 3 #[none]]
probe parse blk [
    any [
        set s integer! (print 'integer) | (print 'none) skip
    ]
]

вывод:

integer
none
integer
none
integer
none
none
true

Обратите внимание, что перед true есть два none. В то время как следующий фрагмент кода выводит ожидаемый результат:

blk: [1 #[none] 2 #[none] 3 #[none]]
probe parse blk [
    any [
        set s integer! (print 'integer) | and none! (print 'none) skip
    ]
]

вывод:

integer
none
integer
none
integer
none
true

Почему предыдущий не мог выдать тот же результат с последним?


person Wayne Cui    schedule 28.06.2014    source источник


Ответы (1)


Ваше первое правило должно быть лучше

probe parse blk [
    any [
        set s integer! (print 'integer) | skip (print 'none) 
    ]
]

как и в вашем первом правиле, вы не печатаете ничего, если нет целого числа, и просто пропускаете после. Это приводит к тому, что вы ничего не печатаете, даже когда курсор находится в конце. Пропуск просто завершает синтаксический анализ.

Во втором правиле нет! в конце неверно, поэтому синтаксический анализ прекращается. Можно написать короче

probe parse blk [
    any [
        set s integer! (print 'integer) |  none! (print 'none) 
    ]
]

Во втором правиле и не перемещают курсор вперед, поэтому вам потребуется дополнительный пропуск. Без и none! уже съедает один продукт.

person sqlab    schedule 28.06.2014