【问题标题】:rebol parse problemrebol解析问题
【发布时间】:2010-08-13 15:54:52
【问题描述】:

简单解析示例:

ab: charset "ab"
parse "aaa" [some ab]  
; == true

如果我想要单线(在适当位置定义 ab),我该怎么做?

parse "aaa" [some [charset "ab"]]
; ** Script Error: Invalid argument: ?function?

parse "aaa" [some (charset "ab")]
; (INTERPRETER HANGS UP)

我使用 REBOL 2.7.7.4.2

更新

在 rebol 3 中:

parse "aaa" [some (charset "ab")]
; == false

【问题讨论】:

    标签: parsing syntax rebol


    【解决方案1】:

    您正在寻找“撰写”

    >> parse "aaa" compose [ some (charset [#"a" #"b"] ) ]
    == true
    

    【讨论】:

    • Compose 将在此示例上运行。但他可能会问,拥有一条解析规则的一般能力来自运行一个表达式。这就是 R3 的 DO 声称要做的事情 (rebol.net/wiki/Parse_Project#DO),但我无法让它工作,请参阅我的答案...
    • 非常感谢,我花了一点时间弄清楚compose 的工作原理。顺便说一句 - charset "ab"charset [#"a" #"b"] 是否等效? (我认为后一种形式用于范围,如果我们插入 -
    • >> ( charset "ab" ) = charset [ #"a" #"b" ] == true
    【解决方案2】:

    在 parse 方言中,括号计算表达式。然而,评估的结果并没有成为解析规则的一部分。这是设计使然,因此您可以按照这种风格工作:

    >> count: 0
    == 0
    
    >> parse "aab" [while ["a" (print "Match a" ++ count)] "b"]
    Match a
    Match a
    == true
    
    >> count
    == 2
    

    让评估成为解析规则的一部分是一个不同的用例。某些实例(例如您的实例)适合 COMPOSE,因为它们只对表达式求值一次。但是我的匹配计数表达式会出错:

    >> count: 0
    == 0
    
    >> rule: compose/deep [while ["a" (print "Match a" ++ count)] "b"]
    Match a
    == [while ["a" 0] "b"]
    
    >> count
    == 1
    
    >> parse "aab" rule
    == false
    

    AFAIK,Rebol 2 没有在解析过程中运行“DO”表达式并将表达式有效地合并到规则中的通用方法。所以你必须使用带括号的代码来获取和设置单词,然后在规则中使用这些单词。

    Rebol 3 据说添加了DO 的版本,但我找不到任何适用于当前 alpha 版本的示例。如 wiki 上所述,我希望这会返回 true 并捕获结果“abc”:

    >> result: none
    == none
    
    >> parse "abc" [copy result thru do [reverse "cba"]]
    == false
    
    >> result
    == none
    

    (它也不适用于更简单的示例。但我尝试过一次,因为“A DO 语句可以用作 COPY、SET 或 RETURN 操作的规则参数。它没有说它 不能在其他地方使用,但也没有说可以在其他地方使用...)

    【讨论】:

    • 感谢您的深入分析,但它超越了当前稳定的版本和我的 rebol 知识(我第一次看到++
    【解决方案3】:

    你真正在看的可能是

    >> parse "aaa" [(ab: charset "ab")  some ab]
    == true
    

    在解析表达式的开头定义一个词,然后将该词用作规则的一部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 2015-09-30
      • 2011-07-25
      相关资源
      最近更新 更多