AppendixB :VTMLGrammar
%terminal{
SPECIAL_CHAR:CharacterTokenDATA:DataTokenSTRING:StringToken
USER_KEYWORD:StringTokenINTEGER:IntegerToken
#Operationkeywords
VTMLATTLISTINSDELEXTINSEXTDELUSROP
ADELADELEND
#Setsofattributenames:
POSLENITEMSATTINCLUDESEXCLUDES
OWNERTIMESTAMPCOMMENTBASE%}
#We'vegot,basically,externalchangesandinternalchanges.AUSROP
#canbeboth,intheory.Werequireexternalchangesfirst,
#speciallydelimited.
doc::='('header')'
(%epsilon%|
('('ins_contents')'('('ins_contents')')*));
header ::=VTMLSTRING:id
(doc_att:att'='STRING:value)*')'external*;
internal ::= '('tag_contents;
tag_contents ::=ins_contents')'
|del_contents')'
|adel_contents')'
|adelend_contents')';
ins_contents ::=INSSTRING:idchange_attlist')'element+;
del_contents ::=DELSTRING:idchange_attlist')'element+;
adel_contents ::=ADELSTRING:idchange_attlist')';
adelend_contents ::=ADELENDSTRING:id')';
element ::=(data|internal);
data ::= DATA:data
change_attlist ::=(change_att:att'='STRING:value)*;
165
#Somefactoringhere,forthetwokindsofcontent.
external ::='('(extinsDATA:data|
extdel|
usropexternal*|
att_contents)
')';
# end_opnotneededforexternalchanges
extins ::=EXTINSSTRING:id
(ext_change_att:att'='STRING:value)*')';
extdel ::=EXTDELSTRING:id
(ext_change_att:att'='STRING:value)*')';
usrop ::=USROPSTRING:id
(usrop_att:att'='STRING:value)*')';
att_contents ::=ATTLISTSTRING:id
(any_att:att'='STRING:value)*')';
doc_att:att%{att=null;%}
::=BASE|tracking_att:attr;
tracking_att:att%{att=null;%}
::=(OWNER
|TIMESTAMP
|COMMENT
|USER_KEYWORD:attr%{att=attr;%});
change_att:att%{att=null;%}
::=ATT
|tracking_att:attr%{att=attr;%}
#Weallowexternalchangeattributes,sowecaninternalizechanges
#withoutremovingtheiroriginalattributes.Theseattributesshould
#notbeusedonchangesthatwerenotoriginallyexternal...
|POS
|BASE
|LEN
ext_change_att:att::=change_att:attr;
usrop_att:att::=change_att:attr
|ITEMS
|INCLUDES
Previous Page Next Page