树梢SGF解析

时间:2009-02-28 02:35:19

标签: ruby parsing treetop

我目前正在尝试编写一个Treetop语法来解析简单游戏格式文件,并且到目前为止它主要使用它。但是,有一些问题已经出现。

  1. 我不确定如何在解析后实际访问Treetop生成的结构。
  2. 是否有更好的方法来处理捕获所有字符而不是我的字符规则?
  3. 有一些评论我似乎无法正确撰写。

    C [player1 [4k \]:hi player2 [3k \]:hi!]

  4. 我无法解决如何处理C []节点的嵌套结构及其中的[]的问题。

    以下是我目前的进展。

    SGF-grammar.treetop

    grammar SgfGrammar
    rule node
        '(' chunk* ')' {
            def value
                text_value
            end
        }
    end
    
    rule chunk
        ';' property_set* {
            def value
                text_value
            end
        }
    end
    
    rule property_set
        property ('[' property_data ']')* / property '[' property_data ']' {
            def value
                text_value
            end
        }
    end
    
    rule property_data
        chars '[' (!'\]' . )* '\]' chars / chars / empty {
            def value
                text_value
            end
        }
    end
    
    rule property
        [A-Z]+ / [A-Z] {
            def value
                text_value
            end
        }
    end
    
    rule chars
        [a-zA-Z0-9_/\-:;|'"\\<>(){}!@#$%^&\*\+\-,\.\?!= \r\n\t]*
    end
    
    rule empty
        ''
    end
    end
    

    我的测试用例,目前不包括带有上述嵌套括号问题的C []节点:

    example.rb

    require 'rubygems'
    require 'treetop'
    require 'sgf-grammar'
    
    parser = SgfGrammarParser.new
    parser.parse("(;GM[1]FF[4]CA[UTF-8]AP[CGoban:3]ST[2]
    RU[Japanese]SZ[19]KM[0.50]TM[1800]OT[5x30 byo-yomi]
    PW[stoic]PB[bojo]WR[3k]BR[4k]DT[2008-11-30]RE[B+2.50])")
    

1 个答案:

答案 0 :(得分:3)

  1. 结构以SyntaxNodes树的形式返回给您(如果结果为nil,请检查parser.failure_reason)。你可以走这棵树或(这是推荐的)你可以用你想做的功能来增加它,只需在根上调用你的主要功能。
  2. 如果您的意思是“如何从节点功能中访问组件?”有几种方法。您可以使用元素[x]表示法或规则:

    来获取它们
    rule url_prefix
        protocol "://" host_name {
           def example
               assert element[0] == protocol
               assert element[2] == host_name
               unless protocol.text_value == "http"
                   print "#{protocol.text_value} not supported" 
                   end
               end
           }
    

    您也可以这样命名:

    rule phone_number
        "(" area_code:( digit digit digit ) ")" ...
    

    然后按名称引用它们。

    1. 如果您只想匹配这些字符,那么您的字符规则就可以了。如果你想匹配任何字符,你可以像使用正则表达式一样使用点(。)。

    2. 我不熟悉您要解析的语言,但您要查找的规则可能类似于:

    3. rule comment
          "C" balanced_square_bracket_string
          end
      rule balanced_square_bracket_string
          "[" ( [^\[\]]  / balanced_square_bracket_string )* "]"
          end
      

      第二条规则的中间部分匹配任何非方括号或带有balanced_square括号的嵌套字符串。

      P.S。有一个相当活跃的Google group,其中有档案在线&amp;可搜索的。