2015-02-17 7 views
2

Предположим, что у вас есть правило, подобное приведенному ниже: Rebol docs on parsing.Rebol 2: Использование правила синтаксического анализа для проверки ввода без кода

Если вы хотите проверить ввод данных с помощью правила только для его проверки, но без того, чтобы содержимое скобок было оценено, как вы можете это сделать?

Есть ли способ, который легко позволяет просто проверять входные данные против правила без содержания содержимого скобок?

rule: [ 
    set action ['buy | 'sell] 
    set number integer! 
    'shares 'at 
    set price money! 
    (either action = 'sell [ 
      print ["income" price * number] 
      total: total + (price * number) 
     ] [ 
      print ["cost" price * number] 
      total: total - (price * number) 
     ] 
    ) 
] 

ответ

2

Зависит, если вы имеете в виду синтаксический анализ или правила синтаксического анализа.

Для разбора правил вам понадобится специальный флаг и функцию, которая будет заботиться о нем:

do?: true 
parse-do: function [code] [if do? [do code]] 
rule: ['a (parse-do [print "got it"])] 
parse [a] rule 
do?: false 
parse [a] rule 

Для синтаксического анализа использования входного INTO:

>> parse [paren (1 + 1)]['paren into [integer! '+ integer!]] 
== true 
+0

Мои искренние извинения. Кажется, что 'in' - это что-то добавленное в R3, правильно? Мне, вероятно, нужно обновить свой ответ, чтобы указать, что я использую R2 :-( – mydoghasworms

+0

. Все равно за помощь – mydoghasworms

+0

. Еще раз: просмотрев документы R2, я вижу, что есть команда 'in'. Это то же самое, что и в R3? Мне нужно сесть и посмотреть, как это решает мою проблему ... – mydoghasworms

3

Ну, вы могли просто удалить parens from your rule:

unparen: func [b [block!]][forall b [case [ 
    paren! = type? b/1 [remove b] block! = type? b/1 [unparen b/1]]] head b] 
new-rule: unparen copy/deep rule 

Затем вы можете разобрать новое правило.

Я боюсь, что это все еще нарушает ваше «легко» требование, однако!

И он не обрабатывает ссылки на вложенные правила.

В качестве информативного в стороне теоретически нет ответа на ваш вопрос. Код в круглых скобках может, например, изменять правило.

+0

Я действительно интересовался этим, но не понимал, как много работы будет :-(Я также боялся вашего последнего утверждения, т. е. код, способный изменить правило. Это одна из тех вещей, где я бы предпочел закрыть глаза и заблокировать мои уши и сказать «ла-ла-ла», чтобы заблокировать его. – mydoghasworms

+0

@mydoghasworms Осторожно, я разбираюсь в noob. код работает, но я могу определенно не обещать, что это лучший, самый короткий или самый простой. Если я найду способ сделать это, не глядя так много «работы», я тоже опубликую его. – MarkI