B Grammatica di convalida della marcatura di contenuto

Descrizione sommaria: Linguaggio di marcatura matematica (MathML) Versione 2.0
Precedente: A Analisi del MathML
Successivo: C Definizioni degli elementi di contenuto
 
B Grammatica di convalida della marcatura di contenuto

Grammatica ENBF per la convalida della struttura della marcatura di contenuto
=============================================================================
// Note
//
// Questa grammatica definisce gli alberi di espressione validi nella
// marcatura di contenuto
//
// ** non definisce la convalida degli attributi -
// ** essa deve essere fatta all'inizio
//
// Presentation_tags è un segnaposto per un tag iniziale
// o finale di un elemento di presentazione valido
//
// #PCDATA sono i dati dei caratteri XML analizzati
//
// i simboli che iniziano con '_' per esempio _mmlarg sono simboli interni
// (per il riconoscimento è in genere richiesta una grammatica ricorsiva)
//
// i simboli in lettere minuscole per esempio 'ci' sono simboli terminali
// che rappresentano elementi di contenuto del MathML
//
// i simboli che iniziano con una maiuscola sono terminali che 
// rappresentano altri token
//
// corretto sb 3.nov.97, 16.nov.97 e 22.dic.1997
// corretto sb 6.gen.98, 6.Feb.1998 e 4.aprile.1998
// le definizioni di spazio bianco includono presentation_tags
Presentation_tags ::= "presentation"        //segnaposto
Space    ::= #x09 | #xoA | #xoD | #x20      //caratteri tab, lf, cr, spazio
S        ::= (Space | Presentation_tags)*   //tratta presentazione come spazio
// solo per la convalida del contenuto
// caratteri
Char     ::= Space | [#x21 - #xFFFD] 
             | [#x00010000 - #x7FFFFFFFF]   //caratteri XML validi
// funzioni dei tag iniziali e finali
// start(\%x) restituisce un tag iniziale valido per l'elemento \%x
// end(\%x) restituisce un tag finale valido per l'elemento \%x
// empty(\%x) restituisce un tag vuoto valido per l'elemento \%x
//
// start(ci)    ::= "<ci>"
// end(cn)              ::= "</cn>"
// empty(plus)  ::= "<plus/>"
//
// La ragione per far ciò consiste nell'evitare di scrivere una grammatica
// per tutti gli attributi. Il modello di seguito non è completo
// per tutti i possibili valori degli attributi.
_start(\%x)      ::= "<\%x" (Char - '>')* ">"
// restituisce un tag iniziale valido per l'elemento \%x
_end(\%x)        ::= "<\%x" Space* ">"
// restituisce un tag finale valido per l'elemento \%x
_empty(\%x)      ::= "<\%x" (Char - '>')* "/>"
// restituisce un tag vuoto valido per l'elemento \%x
_sg(\%x)         ::= S _start(\%x)
// tag iniziale preceduto da spazi bianchi opzionali
_eg(\%x)         ::= _end(\%x) S
// tag finale seguito da spazi bianchi opzionali
_ey(\%x)         ::= S _empty(\%x) S
// tag vuoto preceduto e seguito da spazi bianchi opzionali
// costrutti di contenuto del mathml 
// declare è permesso all'interno di un tipo generico di argomenti
// così possiamo inserirlo dovunque
_mmlall         ::= _container | _relation | _operator | _qualifier | _other
_mmlarg         ::= declare* _container declare*
_container      ::= _token | _special | _constructor
_token          ::= ci | cn | csymbol
_special        ::= apply | lambda | reln | fn
_constructor    ::= interval | list | matrix | matrixrow | set | vector
_other          ::= condition |  declare | sep
_qualifier      ::= lowlimit | uplimit | bvar | degree | logbase
// relazioni
_relation       ::= _genrel | _setrel | _seqrel2ary
_genrel         ::= _genrel2ary | _genrelnary
_genrel2ary     ::= ne
_genrelnary     ::= eq | leq | lt | geq | gt
_setrel         ::=  _seqrel2ary | _setrelnary
_setrel2ary     ::=  in | notin | notsubset | notprsubset
_setrelnary     ::= subset | prsubset
_seqrel2ary     ::= tendsto
//operatori
_operator       ::= _funcop | _sepop | _arithop | _calcop
                | _seqop | _trigop | _statop | _lalgop
                | _logicop | _setop
_funcop         ::= _funcop1ary | _funcopnary
_funcop1ary     ::= inverse     | ident
_funcopnary     ::= fn| compose   // la funzione generale definita dall'utente è n-aria 
// operatori aritmetici
// (nota meno è sia unario che binario)
_arithop        ::= _arithop1ary | _arithop2ary | _arithopnary  | root
_arithop1ary    ::= abs | conjugate | exp | factorial | minus
_arithop2ary    ::= quotient | divide | minus | power | rem
_arithopnary    ::= plus | times | max | min | gcd
// analisi matematica
_calcop         ::= _calcop1ary | log | int | diff | partialdiff
_calcop1ary     ::= ln 
// successioni e serie
_seqop          ::= sum | product | limit
// trigonometria
_trigop         ::= sin | cos | tan | sec | csc | cot | sinh 
                    | cosh | tanh | sech | csch | coth 
                    | arcsin | arccos | arctan
// operatori statistici
_statop         ::= _statopnary | moment
_statopnary     ::= mean | sdev | variance | median | mode
// operatori dell'algebra lineare
_lalgop         ::= _lalgop1ary | _lalgopnary
_lalgop1ary     ::= determinant | transpose
_lalgopnary     ::= selector
// operatori logici
_logicop        ::= _logicop1ary | _logicopnary | _logicop2ary | _logicopquant
_logicop1ary    ::= not
_logicop2ary    ::= implies
_logicopnary    ::= and | or | xor
_logicopquant   ::= forall | exists
// operatori insiemistici
_setop          ::= _setop2ary | _setopnary
_setop2ary      ::= setdiff
_setopnary      ::= union | intersect
// gruppi di operatori
_unaryop        ::=  _func1ary | _arithop1ary | _trigop | _lalgop1ary 
                     | _calcop1ary | _logicop1ary
_binaryop       ::=  _arithop2ary | _setop2ary | _logicop2ary
_naryop         ::=  _arithopnary | _statopnary  | _logicopnary 
                     | _lalgopnary | _setopnary | _funcopnary
_ispop          ::= int | sum | product
_diffop         ::= diff | partialdiff
_binaryrel      ::= _genrel2ary | _setrel2ary |  _seqrel2ary
_naryrel        ::= _genrelnary | _setrelnary
//separatore
sep             ::=  _ey(sep)
// token foglia  e contenuto degli elementi foglia
// nota _mdata qui comprende i costrutti di presentazione.
_mdatai         ::= (#PCDATA | Presentation_tags)*
_mdatan         ::= (#PCDATA | sep | Presentation_tags)*
ci              ::=  _sg(ci) _mdatai _eg(ci)
cn              ::=  _sg(cn) _mdatan _eg(cn)
// condition -  vincoli. contiene sia un singolo
// elemento reln (relazione) che un elemento apply con
// una combinazione logica di relazioni che un
// insieme (sul quale deve essere applicato l'operatore)
condition       ::= _sg(condition)  reln | apply | set  _eg(condition)
// domini per integrale, sommatoria, produttoria
_ispdomain      ::= (lowlimit  uplimit?)
                | uplimit
                | interval
                | condition
// costrutto apply
apply           ::= _sg(apply) _applybody _eg(apply)
_applybody      ::= ( _unaryop _mmlarg  )
//operatori unari 
                                | (_binaryop _mmlarg _mmlarg)
//operatori binari
                                | (_naryop _mmlarg*)
//operatori n-ari, argomenti enumerati
                                | (_naryop bvar* condition _mmlarg)
//operatori n-ari, la condizione definisce la lista degli argomenti
                                | (_ispop  bvar? _ispdomain? _mmlarg)
//integrale, sommatoria, produttoria
                                | (_diffop bvar* _mmlarg)
//operatori differenziali
                                | (log logbase? _mmlarg)
//logaritmi
                                | (moment degree? _mmlarg*)
//momento statistico
                                | (root degree? _mmlarg)
//radici - di base si assume la radice quadrata
                                | (limit bvar* lowlimit? condition? _mmlarg)
//limiti
                                | (_logicopquant bvar+ condition? (reln | apply))
//quantificatori con variabili legate esplicite
// equazioni e relazioni - reln usa la sintassi del lisp (come apply)
// bvar e condition si usano per costruire un vincolo "tale che" o
// "dove" sulla relazione
reln            ::= _sg(reln) _relnbody _eg(reln)
_relnbody       ::= ( _binaryrel bvar* condition? _mmlarg _mmlarg )
                    | ( _naryrel bvar* condition? _mmlarg*  )
// costrutto fn 
fn                      ::= _sg(fn) _fnbody _eg(fn)
_fnbody         ::=  Presentation_tags | container 
// costrutto lambda - nota deve essere presente almeno 1 bvar 
lambda          ::=  _sg(lambda) _lambdabody _eg(lambda)
_lambdabody     ::=  bvar+ _container  //lambda-calcolo multivariato
//costrutto declare 
declare         ::= _sg(declare) _declarebody _eg(declare)
_declarebody    ::= ci (fn | constructor)?
// costruttori
interval        ::=  _sg(interval) _mmlarg _mmlarg _eg(interval)
//inizio e fine definiscono l'intervallo
set         ::=  _sg(set) _lsbody _eg(set)
list        ::=  _sg(list) _lsbody _eg(list)
_lsbody         ::=  _mmlarg*                  //argomenti enumerati 
                 | (bvar* condition _mmlarg)   //una condizione costruisce gli argomenti
matrix          ::= _sg(matrix) matrixrow* _eg(matrix)
matrixrow       ::= _sg(matrixrow) _mmlall* _eg(matrixrow)
//consente matrici di operatori
vector          ::= _sg(vector) _mmlarg* _eg(vector)
//qualificatori - nota _mmlarg potrebbe essere un elemento reln
lowlimit        ::= _sg(lowlimit) _mmlarg  _eg(lowlimit)
uplimit         ::= _sg(uplimit) _mmlarg _eg(uplimit)
bvar            ::= _sg(bvar) ci degree? _eg(bvar)
degree          ::= _sg(degree) _mmlarg _eg(degree)
logbase         ::= _sg(logbase) _mmlarg _eg(logbase)
//relazioni e operatori
// (una dichiarazione per ciascun elemento operatore e relazione)
_relation       ::= _ey(\%relation)         //per esempio <eq/>  <lt/>
_operator       ::= _ey(\%operator)         //per esempio <exp/> <times/>
//elemento math di livello principale
math            ::= _sg(math) mmlall* _eg(math)

Descrizione sommaria: Linguaggio di marcatura matematica (MathML) Versione 2.0
Precedente: A Analisi del MathML
Successivo: C Definizioni degli elementi di contenuto