如何编写解析器

2024-09-28 18:48:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

NamedElements
(    
    (
        NamedElement
        (
            SpecTable
            (
                 SpecColumns
                (

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

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

。。。 ... 你知道吗

只有一种东西叫做NamedElements。其中有很多NamedElement对象。格式简单易懂。我需要为此编写一个解析器,这样我就可以做一些事情,比如获取所有SpecColumn对象,这些对象的名称等于某物。但我不确定最好的办法。你知道吗

我想了一些事情:

循环遍历每个字符,直到找到一个“(”。我做了一个新物体。我将此对象添加为其上方对象的属性。我继续走,直到找到匹配的“)”。这样就完成了对象中的内容。你知道吗

基本上,我从来没有做过这样的事情,我想知道是否有一些既定的方式来做这件事,或者我需要做一些像我上面所描述的?你知道吗


Tags: 对象nameid解析器格式事情isdeletedspeccolumn
2条回答

我建议你把语法正式一点。你知道吗

Name        ::= ( "STRING" )

TypeVarChar ::= ( NUMBER )

DataTypeBit ::= DATATYPEBIT

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

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

SpecTable   ::= ( SpecColumns )

等等

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

在编写解析器时,应该查看lexical analysis。那是个好的开始。一旦你知道什么是你的语言,什么不是你的语言,你就可以“解析”它,然后把它转换成你想要的任何其他东西,可以是另一种语言,格式,任何东西。你知道吗

解析器由扫描器、标记器和lexer组成。我知道这一切都有点模糊,但你的问题也相当开放。你知道吗

相关问题 更多 >