-1

我有这个巨大的莫德琴弦。这是其中的一小部分:

NamedElements
(    
    (
        NamedElement
        (
            SpecTable
            (
                 SpecColumns
                (

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

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

……

只有一件事叫做 NamedElements。这里面有很多 NamedElement 对象。格式很容易理解。我需要为此编写一个解析器,以便我可以做一些事情,比如获取所有具有等于某个名称的 SpecColumn 对象。不过,我不确定最好的方法。

我想过的一些事情:

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

基本上,我以前从来没有做过这样的事情,并且想知道是否有一些既定的方法可以做到这一点,或者我需要做我上面描述的事情吗?

4

2 回答 2

1

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

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

解析器由扫描器、分词器和词法分析器组成。我知道所有这些都有些模糊,但是您的问题也很开放。

于 2013-10-04T17:41:39.327 回答
0

我建议您将语法形式化一点。

Name        ::= ( "STRING" )

TypeVarChar ::= ( NUMBER )

DataTypeBit ::= DATATYPEBIT

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

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

SpecTable   ::= ( SpecColumns )

ETC

于 2013-10-04T17:46:56.687 回答