JSR94 API для TermWare


Связанные документы:

Формат XML-представления спецификаций переписывающих систем.

Варианты форматов - несколько примеров

Формат 1 - простой неструктированный текст

Самый простой формат XML представления - это просто встроить его как текстовый элемент в корневой элемент. Итак, корневой элемент - TermWare: все, что находится внутри корневого элемента является определениями на оригинальном языке TermWare.

DTD выглядит следующим образом:


<!-- XML DTD -->
<?xml version="1.0" encoding="utf-8"?>
<!-- One root element - TermWare and text inside on -->
<!ELEMENT termware-text (#PCDATA)>

К примеру, следующее определение:


    system(SemiGroup,default,
ruleset( ($x*$y)*$z -> $x*($y*$z) ),
FirstTop)
);


будет выглядеть в XML синтаксисе как:



<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE termware-text PUBLIC
"-//GradSoft//DTD TermWare ruleset form 1//EN"
"http://www.gradsoft.ua/dtd/termware-1.dtd">
<termware-text>
<![CDATA[

system(SemiGroup,default,
ruleset( ($x*$y)*$z -> $x*($y*$z) ),
FirstTop)
);

]]>

</termware-text>

Формат два - XML элемент для набора правил

Следующий формат, который иногда удобно применять - выделить XML элементы для доменов и для системы. Домен содержит в себе системы или другие домены. Имя системы, имя БД фактов и стратегии являются атрибутами элемента системы, набор правил, разделенный запятыми -- содержимым.

DTD выглядит следующим образом:


 <!-- XML DTD -->
<?xml version="1.0" encoding="utf-8"?>
<! -->

<!ELEMENT termware domain>
<!ELEMENT domain (domain* system-text*) >
<!ATTLIST domain
name CDATA #REQUIRED
id NMTOKEN #IMPLIED
>
<!ELEMENT system-text (#PCDATA) >
<!ATTLIST system-text
name CDATA #REQUIRED,
facts CDATA #REQUIRED,
strategy CDATA #REQUIRED,
id NMTOKEN #IMPLIED

>

Пример:




<termware>
<domain name="examples" >
<system-text name="Life" strategy="FirstTop" facts="ua.gradsoft.termwaredemos.life.Life1Facts" >
<![CDATA[

#@display-name born-of-new-cell
{ l($i,$j) : $T} [ n($i,$j) == 3 ] -> $T [ putCell($i,$j) ],

#@display-name static-cell
{ l($i,$j) : $T} [ n($i,$j) == 2 ] -> $T [ existsCell($i,$j) ? putCell($i,$j) : removeCell($i,$j) ] ,

#@display-name die-of-cell
{ l($i,$j) : $T} [ n($i,$j) > 3 || n($i,$j) < 2 ] -> $T [ removeCell($i,$j) ],


#@display-name empty-set
{ } -> checkEmpty($T) [ showGeneration(), generateNextTestSet($T) ],

#@display-name check-empty-notnull
checkEmpty({$x:$Y}) -> { $x:$Y },

#@display-name check-empty-null
checkEmpty({}) -> END

]]>
</system-text>
</domain>
</termware>

Формат три - XML элемент для набора правил.

Следующий уровень детализации: выделяется элемент для каждого правила.




<!-- XML DTD -->
<?xml version="1.0" encoding="utf-8"?>
<! -->

<!ELEMENT termware domain>
<!ELEMENT domain (domain* system*) >
<!ATTLIST domain
name CDATA #REQUIRED
id ID #IMPLIED
>
<!ELEMENT system (import-ruleset | rule-text)* >
<!ATTLIST system
name CDATA #REQUIRED,
facts CDATA #REQUIRED,
strategy CDATA #REQUIRED,
id ID #IMPLIED
>
<!ELEMENT import-ruleset (#PCDATA) >
<!ATTLIST import-ruleset
name CDATA #REQUIRED
id ID #IMPLIED
>
<!ELEMENT rule-text (#PCDATA) >
<!ATTLIST rule-text
name CDATA #IMPLIED
description PCDATA #IMPLIED
id ID #IMPLIED
>

Предыдущий пример будет выглядеть следующим образом:




<domain name="examples" >
<system name="Life" strategy="FirstTop" facts="ua.gradsoft.termwaredemos.life.Life1Facts" >

<rule-text description="born-of-new-cell>
<![CDATA[
{ l($i,$j) : $T} [ n($i,$j) == 3 ] -> $T [ putCell($i,$j) ]
]]>
</rule-text>
<rule-text description="static cell">
<![CDATA[
{ l($i,$j) : $T} [ n($i,$j) == 2 ] -> $T [ existsCell($i,$j) ? putCell($i,$j) : removeCell($i,$j) ]
]]>
<rule-text description="die">
<![CDATA[
{ l($i,$j) : $T} [ n($i,$j) > 3 || n($i,$j) < 2 ] -> $T [ removeCell($i,$j) ]
]]>
</rule-text>
<rule-text description="empty set">
<![CDATA[
{ } -> checkEmpty($T) [ showGeneration() , generateNextTestSet($T) ],
]]>
</rule-text>
<rule-text description="check-empty-notempty">
<![CDATA[
checkEmpty({$x:$Y}) -> { $x:$Y },
]]>
</rule-text>
<rule-text description="check-empty-empty">
<![CDATA[
checkEmpty({}) -> END
]]>
</rule-text>
]]>
</system-text>
</domain>


Как видим, все довольно очевидно.

DTD и спецификация атрибутов

Итого, DTD будет иметь следующий вид:




<?xml version="1.0" encoding="UTF-8"?>

<!--
Document : termware.dtd
Author : Ruslan Shevchenko
Description:
DTD for XML representation of TermWare systems


PUBLIC ID : -//GradSoft//DTD TermWare ruleset//EN
SYSTEM ID : http://www.gradsoft.ua/termware/termware.dtd
-->

<!ELEMENT termware (domain*) >
<!ELEMENT termware-text (#PCDATA) >
<!ELEMENT domain (domain | system)* >
<!ATTLIST domain
name CDATA #REQUIRED
id ID #IMPLIED
>
<!ELEMENT system (import-ruleset | rule-text)* >
<!ATTLIST system
name CDATA #REQUIRED
facts CDATA #REQUIRED
strategy CDATA #REQUIRED
id ID #IMPLIED
debug CDATA #IMPLIED
debug-entity CDATA #IMPLIED
pass-via CDATA #IMPLIED
>
<!ELEMENT import-ruleset (#PCDATA) >
<!ATTLIST import-ruleset
name CDATA #REQUIRED
id ID #IMPLIED
>
<!ELEMENT rule-text (#PCDATA) >
<!ATTLIST rule-text
name CDATA #IMPLIED
description CDATA #IMPLIED
id ID #IMPLIED
>

Атрибуты элемента domain:

Дочерние элементы domain:

Атрибуты элементы system:

Дочерние атрибуты system:


Атрибуты rule:

Свойства исполняемого множеств правил

Запуск тестов из JSR-94 TCK