我有这个巨大的Maude字符串。这是它的一小部分:
NamedElements
(
(
NamedElement
(
SpecTable
(
SpecColumns
(
(
SpecColumn
(
Name
(
"Id"
)
,
TypeVarChar
(
18
)
)
,
SpecColumn
(
name
(
"IsDeleted"
)
,
DataTypeBit
)
... ...
只有一件名为NamedElements的东西。这里面有很多NamedElement对象。格式很容易理解。我需要为此编写一个解析器,以便我可以执行类似于获取Name等于某个东西的所有SpecColumn对象的操作。我不确定最好的方法。
我想过的一些事情:
循环遍历每个字符,直到找到'('。我创建一个新对象。我将此对象添加为其上方对象的属性。我继续前进,直到找到匹配的')'。然后,最终确定该对象中的内容。
基本上,我之前从未做过这样的事情,并且想知道是否有一些既定的方法可以做到这一点,还是我需要做一些像我上面描述的那样的事情?
答案 0 :(得分:1)
要编写解析器,您需要定义语法和语法:可以使用的单词以及如何将这些单词组合在一起以生成语句。这看起来很像对象的标记,类似于XML或JSON。但是,您仍然需要在编写解析器之前定义语言。
在编写解析器时,您应该查看lexical analysis。这是一个很好的起点。一旦你知道你的语言是什么和不是什么,你就可以“解析”它,并将它转换成你想要的任何其他东西,无论是另一种语言,格式,等等。
解析器由扫描仪,标记器和词法分析器组成。我知道所有这些都有点模糊,但你的问题也相当开放。
答案 1 :(得分:0)
我建议你稍微正式化语法。
Name ::= ( "STRING" )
TypeVarChar ::= ( NUMBER )
DataTypeBit ::= DATATYPEBIT
SpecColumn ::= ( Name {, TypeVarChar | DataTypeBit} )
SpecColumns ::= ( SpecColumn {, SpecColumn}* )
SpecTable ::= ( SpecColumns )
等