Ruby 树顶SGF解析

Ruby 树顶SGF解析,ruby,parsing,treetop,Ruby,Parsing,Treetop,我目前正在尝试编写一个树顶语法来解析简单的游戏格式文件,到目前为止,它基本上可以正常工作。然而,出现了一些问题 我不确定如何实际访问Treetop在解析后生成的结构 有没有比我的角色规则更好的抓取所有角色的方法 有一种情况是,我的评论似乎写得不对 C[player1[4k\]:hi player2[3k\]:hi!] 我不知道如何处理C[]节点的嵌套结构,其中包含[] 以下是我目前的进展 sgf语法。树梢 grammar SgfGrammar rule node '(' chunk* '

我目前正在尝试编写一个树顶语法来解析简单的游戏格式文件,到目前为止,它基本上可以正常工作。然而,出现了一些问题

  • 我不确定如何实际访问Treetop在解析后生成的结构
  • 有没有比我的角色规则更好的抓取所有角色的方法
  • 有一种情况是,我的评论似乎写得不对

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

  • 我不知道如何处理C[]节点的嵌套结构,其中包含[]

    以下是我目前的进展

    sgf语法。树梢

    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
    
  • 该结构以SyntaxNodes树的形式返回给您(如果结果为nil,请检查parser.failure\u reason)。你可以遍历这棵树,或者(这是推荐的)你可以用你想要的函数来扩充它,只需在根上调用你的主函数
  • 如果您的意思是“如何从节点函数中访问组件?”有几种方法。您可以使用元素[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 ) ")" ...
    
    然后用名字来指代他们

  • 如果只想匹配这些字符,则chars规则看起来很好。如果要匹配任何字符,可以像在正则表达式中一样使用点(.)

  • 我不熟悉您试图解析的语言,但您正在寻找的规则可能类似于:

  • 第二条规则的中间部分匹配任何不是方括号或带有方括号的嵌套字符串的内容


    另外,还有一个相当活跃的网站,可以在线搜索存档。

    感谢MarkusQ提供的提示。我会继续思考这个问题,但你让我朝着正确的方向前进。几乎一年后,任何人读到这篇文章,结果都是:-这不是世界上最有效的东西,但却是一个伟大的TreeTop/SGF解析实验。
    rule phone_number
        "(" area_code:( digit digit digit ) ")" ...
    
    rule comment
        "C" balanced_square_bracket_string
        end
    rule balanced_square_bracket_string
        "[" ( [^\[\]]  / balanced_square_bracket_string )* "]"
        end