我该如何编写解析器?

时间:2013-10-04 17:36:12

标签: c# python parsing

我有这个巨大的Maude字符串。这是它的一小部分:

NamedElements
(    
    (
        NamedElement
        (
            SpecTable
            (
                 SpecColumns
                (

                    (
                        SpecColumn
                        (
                            Name
                            (
                                "Id"
                            )
                            ,
                             TypeVarChar
                            (
                                18
                            )

                        )
                        ,
                        SpecColumn
                        (
                            name
                            (
                                "IsDeleted"
                            )
                            ,
                                 DataTypeBit
                        )

... ...

只有一件名为NamedElements的东西。这里面有很多NamedElement对象。格式很容易理解。我需要为此编写一个解析器,以便我可以执行类似于获取Name等于某个东西的所有SpecColumn对象的操作。我不确定最好的方法。

我想过的一些事情:

循环遍历每个字符,直到找到'('。我创建一个新对象。我将此对象添加为其上方对象的属性。我继续前进,直到找到匹配的')'。然后,最终确定该对象中的内容。

基本上,我之前从未做过这样的事情,并且想知道是否有一些既定的方法可以做到这一点,还是我需要做一些像我上面描述的那样的事情?

2 个答案:

答案 0 :(得分:1)

要编写解析器,您需要定义语法和语法:可以使用的单词以及如何将这些单词组合在一起以生成语句。这看起来很像对象的标记,类似于XML或JSON。但是,您仍然需要在编写解析器之前定义语言。

在编写解析器时,您应该查看lexical analysis。这是一个很好的起点。一旦你知道你的语言是什么和不是什么,你就可以“解析”它,并将它转换成你想要的任何其他东西,无论是另一种语言,格式,等等。

解析器由扫描仪,标记器和词法分析器组成。我知道所有这些都有点模糊,但你的问题也相当开放。

答案 1 :(得分:0)

我建议你稍微正式化语法。

Name        ::= ( "STRING" )

TypeVarChar ::= ( NUMBER )

DataTypeBit ::= DATATYPEBIT

SpecColumn  ::= ( Name {, TypeVarChar | DataTypeBit} )

SpecColumns ::= ( SpecColumn {, SpecColumn}* )

SpecTable   ::= ( SpecColumns )