你也许能回答这样一个问题:G1的结构是否能证明L(G1)是L(G2)的一个子集,方法是证明G1的每个元素与G2的每个元素兼容,最重要的是证明每个语法规则
在G1中,在G2中有一个相应的规则,其中删除了元素。您对dtd进行diffing的想法似乎是沿着这条线的,附带的条件是,如果diffs很大,那么您就只能处理一般的问题,而不是简单的问题。至少你描述问题的方式(G2来自主DTD)我认为你有机会。
差异的目的是通过找出最小的差异来确定兼容的规则。
你想检查一下,
在G2中派生的令牌字符串。这看起来就像比较两个语言的原始无约束问题;我们现在只是比较两个规则g1和g2的子语言。
所以现在我认为你必须坚持g1可以到达的每个子规则在结构上与g2中相应的子规则兼容,这样才能使它实用。
另一方面,我的公司
Smart Differencer
编辑:我尝试了以下两种DTD,一种来自另一种:
订单格式.xml
:
<?xml version='1.0' ?>
<!DOCTYPE orderform [
<!ELEMENT orderform (name,company,address,items) >
<!ELEMENT name ( firstname, lastname )>
<!ELEMENT firstname ( #PCDATA )>
<!ELEMENT lastname ( #PCDATA )>
<!ELEMENT company ( #PCDATA )>
<!ELEMENT address ( street, city, country )>
<!ELEMENT street ( #PCDATA )>
<!ELEMENT city( #PCDATA )>
<!ELEMENT country ( zipcode | nation )>
<!ELEMENT zipcode ( #PCDATA )>
<!ELEMENT nation ( #PCDATA )>
<!ELEMENT items (item)+ >
<!ELEMENT item ( partnumber, quantity, unitprice)>
<!ELEMENT partnumber ( #PCDATA )>
<!ELEMENT quantity ( #PCDATA )>
<!ELEMENT unitprice ( #PCDATA )>
]>
<done/>
orderform2.xml文件
:
<?xml version='1.0' ?>
<!DOCTYPE orderform [
<!ELEMENT orderform (name,company,location,item) >
<!ELEMENT name ( firstname, lastname )>
<!ELEMENT firstname ( #PCDATA )>
<!ELEMENT lastname ( #PCDATA )>
<!ELEMENT company ( #PCDATA )>
<!ELEMENT location ( street, city, country )>
<!ELEMENT street ( #PCDATA )>
<!ELEMENT city( #PCDATA )>
<!ELEMENT country ( zipcode | nation )>
<!ELEMENT zipcode ( #PCDATA )>
<!ELEMENT nation ( #PCDATA )>
<!ELEMENT item ( partnumber, unitprice)>
<!ELEMENT partnumber ( #PCDATA )>
<!ELEMENT quantity ( #PCDATA )>
<!ELEMENT unitprice ( #PCDATA )>
]>
<done/>
[先看看你自己是否能发现差异:-)
C:\DMS\Domains\XML\Analyzers\SmartDifferencer\Source>DMSSmartDifferencer XML -SuppressSourceCodeForRenamings C:\DMS\Domains\XML\Tool
s\DTD2COBOL\orderform.xml C:\DMS\Domains\XML\Tools\DTD2COBOL\orderform2.xml
Copyright (C) 2009 Semantic Designs; All Rights Reserved
XML SmartDifferencer Version 1.1.1
Copyright (C) 2009 Semantic Designs, Inc; All Rights Reserved; SD Confidential
Powered by DMS (R) Software Reengineering Toolkit
*** Unregistered SmartDifferencer Version 1.1
*** Operating with evaluation limits.
*** Parsing file C:/DMS/Domains/XML/Tools/DTD2COBOL/orderform.xml ...
*** Parsing file C:/DMS/Domains/XML/Tools/DTD2COBOL/orderform2.xml ...
*** Creating suffix tree ...
*** Determining maximal pairs ...
*** Sorting maximal pairs ...
*** Determining differences ...
*** Printing edits ...
Rename 4.1-9.44 to 4.1-9.45 with 'address'->'location' and 'items'~>'item'
Delete 15.1-15.25 merging 15.18-15.21 into 4.44-4.47
<<!ELEMENT items (item)+ >
Delete 16.30-16.38 merging 16.30-16.38 into 15.18-15.28 with 'quantity'~>'partnumber'
< quantity,
是的,我就是这么做的(符号N.M表示“第N行,第M列”)。