Ero sivun ”Attribuuttikielioppi” versioiden välillä

[arvioimaton versio][katsottu versio]
Poistettu sisältö Lisätty sisältö
Ak: Uusi sivu: '''Attribuuttikielioppi''' määrittelee attribuutit formaalin kielen pääte- ja välikesymboleille sekä produktioille ominaiset laskusäännöt, joissa attribuuttien arvoja käy...
 
p muokattu esimerkin ulkoasua
Rivi 1:
'''Attribuuttikielioppi''' määrittelee attribuutit formaalin kielen pääte- ja välikesymboleille sekä produktioille ominaiset laskusäännöt, joissa attribuuttien arvoja käytetään. Laskusääntöjä kutsutaan myös semanttisiksi toiminnoiksi. Laskusäännöillä ei saa olla sivuvaikutuksia. Kieliopista voidaan muodostaa abstrakti syntaksipuu ja attribuuttien laskusäännöt ovat puun solmukohdissa. Attribuutit voivat olla joko ''synteettisiä'' tai ''periytyneitä''. Synteettiset attribuutit ovat aina attribuuttien laskusääntöjen tuloksista saatuja ja periytyneet ovat vanhemmilta solmukohdilta saatuja. <ref>{{Kirjaviite | Tekijä = Aho, Sethi, Ullman | Nimeke = Compilers: Principles, Techniques and Tools| Vuosi = 1987| Luku = | Sivu = | Selite = | Julkaisupaikka = | Julkaisija = Addison-Wesley | Tunniste = | www = | www-teksti = | Tiedostomuoto = | Viitattu = 26.5.2013 | Kieli = englanti}}</ref>
 
==Esimerkki==
 
Esimerkin [[Yhteydetön kielioppi]] kuvaa kielen, jolla voi kirjoittaa yksinkertaisia matemaattisia lauseita:
 
<code>
{| class="wikitable"
'''Expr''' &rarr; '''Expr''' + '''Term'''
! Kielioppi
'''Expr''' &rarr; '''Term'''
|-
'''Term''' &rarr; '''Term''' * '''Factor'''
| '''TermExpr''' &rarr; '''FactorExpr''' + '''Term'''
|-
'''Factor''' &rarr; "(" '''Expr''' ")"
| '''FactorExpr''' &rarr; ''integer'Term'''
|-
</code>
| '''ExprTerm''' &rarr; '''ExprTerm''' +* '''TermFactor'''
|-
| '''ExprTerm''' &rarr; '''TermFactor'''
|-
| '''Factor''' &rarr; "(" '''Expr''' ")"
|-
| '''Factor''' &rarr; ''integer''
|}
 
Alla esitettyllä attribuuttikieliopilla pystyy laskemaan lukuarvoja kirjoitetuista lausekkeista. Kielioppi käyttää vain synteettisiä attribuutteja, joten se on [[S-attribuuttikielioppi]].
 
<code>
{| class="wikitable"
'''Expr<sub>1</sub>''' &rarr; '''Expr<sub>2</sub>''' + '''Term''' [ '''Expr<sub>1</sub>'''.value = '''Expr<sub>2</sub>'''.value + '''Term'''.value ]
|-
'''Expr''' &rarr; '''Term''' [ '''Expr'''.value = '''Term'''.value ]
! Kielioppi !! Semanttiset toiminnot
'''Term<sub>1</sub>''' &rarr; '''Term<sub>2</sub>''' * '''Factor''' [ '''Term<sub>1</sub>'''.value = '''Term<sub>2</sub>'''.value * '''Factor'''.value ]
|-
'''Term''' &rarr; '''Factor''' [ '''Term'''.value = '''Factor'''.value ]
| '''FactorExpr<sub>1</sub>''' &rarr; "(" '''Expr<sub>2</sub>''' ")"+ '''Term''' || [ '''FactorExpr<sub>1</sub>'''.value = '''Expr<sub>2</sub>'''.value + '''Term'''.value ]
|-
'''Factor''' &rarr; ''integer'' [ '''Factor'''.value = stringToInteger(''integer''.string) ]
| '''Expr''' &rarr; '''Term''' || [ '''Expr'''.value = '''Term'''.value ]
|-
</code>
| '''ExprTerm<sub>1</sub>''' &rarr; '''ExprTerm<sub>2</sub>''' +* '''TermFactor''' || [ '''ExprTerm<sub>1</sub>'''.value = '''ExprTerm<sub>2</sub>'''.value +* '''TermFactor'''.value ]
|-
| '''Term''' &rarr; '''Factor''' || [ '''Term'''.value *= '''Factor'''.value ]
|-
| '''TermFactor''' &rarr; "(" '''FactorExpr''' ")" || [ '''TermFactor'''.value = '''FactorExpr'''.value ]
|-
| '''Factor''' &rarr; ''integer'' || [ '''Factor'''.value = stringToInteger(''integer''.string) ]
|}
 
 
===Lähteet===