Monaadilised parserid Süntaksanalüüs ja parserid Parseri ülesandeks on: – kontrollida kas sisendstring on süntaktiliselt korrektne; – konstrueerida sisendstringile vastav AST. Parserite soovitavad omadused: – BNF lähedane esitus; – parserite konstrueerimine olemasolevatest parseritest; – mittedetermineeritud grammatikate kasutamine; – kontekstist sõltuvate keelte äratundmine.
Monaadilised parserid Parserite tüüp newtype P❛rs❡r ❛ ❂ P ✭ ❙tr✐♥❣ ✦ ❬✭ ❛ ❀ ❙tr✐♥❣ ✮❪✮ r✉♥P ✿✿ P❛rs❡r ❛ ✦ ❙tr✐♥❣ ✦ ❬✭ ❛ ❀ ❙tr✐♥❣ ✮❪ r✉♥P ✭ P ♣ ✮ ❂ ♣ Parserite monaad instance ▼♦♥❛❞ P❛rs❡r where r❡t✉r♥ ❛ ❂ P ✩ ✕ ❝s ✦ ❬✭ ❛ ❀ ❝s ✮❪ ♣ ❃ ❃ ❂ ❢ ❂ P ✩ ✕ ❝s ✦ ❝♦♥❝❛t ❬ r✉♥P ✭ ❢ ❛ ✮ ❝s ✵ ❥ ✭ ❛ ❀ ❝s ✵ ✮ ✥ r✉♥P ♣ ❝s ❪
Monaadilised parserid Primitiivparserid instance ▼♦♥❛❞P❧✉s P❛rs❡r where ❂ P ✩ ✕ ❝s ✦ ❬ ❪ ♠③❡r♦ ♠♣❧✉s ♣ q ❂ P ✩ ✕ ❝s ✦ r✉♥P ♣ ❝s ✰ ✰ r✉♥P q ❝s ✭ ❁ ❥ ❃ ✮ ✿✿ P❛rs❡r ❛ ✦ P❛rs❡r ❛ ✦ P❛rs❡r ❛ ♣ ❁ ❥ ❃ q ❂ ♣ ❵ ♠♣❧✉s ❵ q ✿✿ P❛rs❡r ❈❤❛r ✐t❡♠ ✐t❡♠ ❂ P ✩ ✕ ❝s ✦ ❬✭ ❤❡❛❞ ❝s ❀ t❛✐❧ ❝s ✮ ❥ ♥♦t ✭ ♥✉❧❧ ❝s ✮❪
Monaadilised parserid Elementaarparserid ✿✿ ✭ ❈❤❛r ✦ ❇♦♦❧ ✮ ✦ P❛rs❡r ❈❤❛r s❛t ❂ do ❢ ❝ ✥ ✐t❡♠ ❀ if ♣ ❝ then r❡t✉r♥ ❝ else ♠③❡r♦ ❣ s❛t ♣ ✿✿ ❈❤❛r ✦ P❛rs❡r ❈❤❛r ❝❤❛r ❝❤❛r ❝ ❂ s❛t ✭ ❝ ✑ ✮ Näide data ❚r❡❡ ❂ ◆✐❧ ❥ ❇✐♥ ❚r❡❡ ❚r❡❡ ♣❛r❡♥s ✿✿ P❛rs❡r ❚r❡❡ ♣❛r❡♥s ❂ do ❝❤❛r ’(’ t✶ ✥ ♣❛r❡♥s ❝❤❛r ’)’ t✷ ✥ ♣❛r❡♥s r❡t✉r♥ ✭ ❇✐♥ t✶ t✷ ✮ ❁ ❥ ❃ r❡t✉r♥ ◆✐❧
Monaadilised parserid Iteratsioon ✿✿ P❛rs❡r ❛ ✦ P❛rs❡r ❬ ❛ ❪ ♠❛♥② ♠❛♥② ♣ ❂ ♠❛♥②✶ ♣ ❁ ❥ ❃ r❡t✉r♥ ❬ ❪ ✿✿ P❛rs❡r ❛ ✦ P❛rs❡r ❬ ❛ ❪ ♠❛♥②✶ ♠❛♥②✶ ♣ ❂ do ❢ ❛ ✥ ♣ ❀ ❛s ✥ ♠❛♥② ♣ ❀ r❡t✉r♥ ✭ ❛ ✿ ❛s ✮ ❣
Lihtsaid parsereid Võtmesõnad ✿✿ ❙tr✐♥❣ ✦ P❛rs❡r ❙tr✐♥❣ str✐♥❣ str✐♥❣ "" ❂ r❡t✉r♥ "" str✐♥❣ ✭ ❝ ✿ ❝s ✮ ❂ do ❢ ❝❤❛r ❝ ❀ str✐♥❣ ❝s ❀ r❡t✉r♥ ✭ ❝ ✿ ❝s ✮ ❣ Identifikaatorid ✐❞❡♥t✐☞❡r ✿✿ P❛rs❡r ❙tr✐♥❣ ✐❞❡♥t✐☞❡r ❂ do ❝ ✥ ❧♦✇❡r ❝s ✥ ♠❛♥② ❛❧♣❤❛♥✉♠ r❡t✉r♥ ✭ ❝ ✿ ❝s ✮
Lihtsaid parsereid Naturaalarvud ♥❛t✉r❛❧ ✿✿ P❛rs❡r ■♥t ♥❛t✉r❛❧ ❂ do ❞s ✥ ♠❛♥②✶ ❞✐❣✐t r❡t✉r♥ ✭ ❢♦❧❞❧✶ ✭ ✕ ❛ ❜ ✦ ✶✵ ✄ ❛ ✰ ❜ ✮ ❞s ✮ ❞✐❣✐t ✿✿ P❛rs❡r ■♥t ❂ do ❝ ✥ s❛t ✐s❉✐❣✐t ❞✐❣✐t r❡t✉r♥ ✭ ♦r❞ ❝ � ♦r❞ ’0’ ✮ Täisarvud ✐♥t❡❣❡r ✿✿ P❛rs❡r ■♥t ✐♥t❡❣❡r ❂ do ❢ ❝❤❛r ’-’ ❀ ♥ ✥ ♥❛t✉r❛❧ ❀ r❡t✉r♥ ✭ � ♥ ✮ ❣ ❁ ❥ ❃ ♥❛t✉r❛❧
Lihtsaid parsereid Reaalarvud ✌♦❛t✐♥❣ ✿✿ P❛rs❡r ❉♦✉❜❧❡ ✌♦❛t✐♥❣ ❂ do ✐ ✥ ✐♥t❡❣❡r ❢ ✥ ❢r❛❝t✐♦♥ ❁ ❥ ❃ r❡t✉r♥ ✵ r❡t✉r♥ ✭ ❢r♦♠■♥t❡❣r❛❧ ✐ ✰ ❢ ✮ ❢r❛❝t✐♦♥ ✿✿ P❛rs❡r ❉♦✉❜❧❡ ❢r❛❝t✐♦♥ ❂ do ❝❤❛r ’.’ ❞s ✥ ♠❛♥②✶ ❞✐❣✐t r❡t✉r♥ ✭ ❢♦❧❞r ♦♣ ✵ ❞s ✮ where ❞ ❵ ♦♣ ❵ ① ❂ ✭ ① ✰ ❢r♦♠■♥t❡❣r❛❧ ❞ ✮ ❂ ✶✵
Lihtsaid parsereid Tühisümbolid ✿✿ P❛rs❡r ❙tr✐♥❣ s♣❛❝❡ s♣❛❝❡ ❂ ♠❛♥② ✭ s❛t ✐s❙♣❛❝❡ ✮ ✿✿ P❛rs❡r ❛ ✦ P❛rs❡r ❛ t♦❦❡♥ t♦❦❡♥ ♣ ❂ do ❢ ❛ ✥ ♣ ❀ s♣❛❝❡ ❀ r❡t✉r♥ ❛ ❣ ❦❡②❝ ❝ ❂ t♦❦❡♥ ✭ ❝❤❛r ❝ ✮ ❦❡②✇ ❝s ❂ t♦❦❡♥ ✭ str✐♥❣ ❝s ✮ ❂ t♦❦❡♥ ✐❞❡♥t✐☞❡r ✐❞❡♥t ♥❛t ❂ t♦❦❡♥ ♥❛t✉r❛❧ ❂ t♦❦❡♥ ✐♥t❡❣❡r ✐♥t ✌♦❛t ❂ t♦❦❡♥ ✌♦❛t✐♥❣
Parserite transformaatorid Sulud ♣❛❝❦ ✿✿ P❛rs❡r ❛ ✦ P❛rs❡r ❜ ✦ P❛rs❡r ❝ ✦ P❛rs❡r ❜ ♣❛❝❦ s✶ ♣ s✷ ❂ do ❢ s✶ ❀ ① ✥ ♣ ❀ s✷ ❀ r❡t✉r♥ ① ❣ Näide ♣❛r❡♥ ♣ ❂ ♣❛❝❦ ✭ ❦❡②❝ ’(’ ✮ ♣ ✭ ❦❡②❝ ’)’ ✮ ❜r❛❝❦ ♣ ❂ ♣❛❝❦ ✭ ❦❡②❝ ’[’ ✮ ♣ ✭ ❦❡②❝ ’]’ ✮ ❜❧♦❝❦ ♣ ❂ ♣❛❝❦ ✭ ❦❡②✇ "begin" ✮ ♣ ✭ ❦❡②✇ "end" ✮
Parserite transformaatorid Eraldajaga jadad s❡♣❜② ✿✿ P❛rs❡r ❛ ✦ P❛rs❡r ❜ ✦ P❛rs❡r ❬ ❛ ❪ ♣ ❵ s❡♣❜② ❵ s❡♣ ❂ ✭ ♣ ❵ s❡♣❜②✶ ❵ s❡♣ ✮ ❁ ❥ ❃ r❡t✉r♥ ❬ ❪ s❡♣❜②✶ ✿✿ P❛rs❡r ❛ ✦ P❛rs❡r ❜ ✦ P❛rs❡r ❬ ❛ ❪ ♣ ❵ s❡♣❜②✶ ❵ s❡♣ ❂ do ❛ ✥ ♣ ❛s ✥ ♠❛♥② ✭ s❡♣ ❃ ❃ ♣ ✮ r❡t✉r♥ ✭ ❛ ✿ ❛s ✮ Näide ❝♦♠♠❛▲✐st ♣ ❂ s❡♣❜② ♣ ✭ ❦❡②✇ "," ✮ ❂ s❡♣❜② ♣ ✭ ❦❡②✇ ";" ✮ s❡♠✐❝▲✐st ♣
Aritmeetilised avaldised Grammatika ❡①♣r ❂ ✐♥t ❥ ❡①♣r ✰ ❡①♣r ❥ ❡①♣r � ❡①♣r ❥ ❡①♣r ✄ ❡①♣r ❥ ❡①♣r ❂ ❡①♣r ❥ ❡①♣r ^ ❡①♣r ❥ ✭ ❡①♣r ✮ Abstraktne süntaksipuu data ❊①♣r ❂ ❈♦♥ ■♥t ❥ ❊①♣r ✿✰✿ ❊①♣r ❥ ❊①♣r ✿ � ✿ ❊①♣r ❥ ❊①♣r ✿ ✄ ✿ ❊①♣r ❥ ❊①♣r ✿ ❂ ✿ ❊①♣r ❥ ❊①♣r ✿ ^ ✿ ❊①♣r
Aritmeetilised avaldised Parser ver. 0 ❡①♣r✵ ❂ do ❢ ❡✵ ✥ ❡①♣r✵ ❀ ❦❡②❝ ’+’ ❀ ❡✶ ✥ ❡①♣r✵ ❀ r❡t✉r♥ ✭ ❡✵ ✿✰✿ ❡✶ ✮ ❣ ❁ ❥ ❃ do ❢ ❡✵ ✥ ❡①♣r✵ ❀ ❦❡②❝ ’-’ ❀ ❡✶ ✥ ❡①♣r✵ ❀ r❡t✉r♥ ✭ ❡✵ ✿ � ✿ ❡✶ ✮ ❣ ❁ ❥ ❃ ✿✿✿ ❁ ❥ ❃ do ❢ ❡✵ ✥ ❡①♣r✵ ❀ ❦❡②❝ ’^’ ❀ ❡✶ ✥ ❡①♣r✵ ❀ r❡t✉r♥ ✭ ❡✵ ✿ ^ ✿ ❡✶ ✮ ❣ ❁ ❥ ❃ do ❢ ✐ ✥ ✐♥t ❀ r❡t✉r♥ ✭ ❈♦♥ ✐ ✮ ❣ ❁ ❥ ❃ ♣❛r❡♥ ❡①♣r✵ NB! Ei tööta kuna grammatika on vasakrekursiivne!!
Aritmeetilised avaldised Parser ver. 1 ❡①♣r✶ ❂ do ❛ ✥ ❛t♦♠✶ ♦♣ ✥ ♦♣❡r✶ ✥ ❡①♣r✶ ❡ r❡t✉r♥ ✭ ❛ ❵ ♦♣ ❵ ❡ ✮ ❁ ❥ ❃ ❛t♦♠✶ ♦♣❡r✶ ❂ ✭ ❦❡②❝ ’+’ ❃ ❃ r❡t✉r♥ ✭✿✰✿✮✮ ❁ ❥ ❃ ✭ ❦❡②❝ ’-’ ❃ ❃ r❡t✉r♥ ✭✿ � ✿✮✮ ❁ ❥ ❃ ✭ ❦❡②❝ ’*’ ❃ ❃ r❡t✉r♥ ✭✿ ✄ ✿✮✮ ❁ ❥ ❃ ✭ ❦❡②❝ ’/’ ❃ ❃ r❡t✉r♥ ✭✿ ❂ ✿✮✮ ❁ ❥ ❃ ✭ ❦❡②❝ ’^’ ❃ ❃ r❡t✉r♥ ✭✿ ^ ✿✮✮ ❛t♦♠✶ ❂ do ❢ ✐ ✥ ✐♥t ❀ r❡t✉r♥ ✭ ❈♦♥ ✐ ✮ ❣ ❁ ❥ ❃ ♣❛r❡♥ ❡①♣r✶
Parserite transformaatorid Eraldajaga jadad ❝❤❛✐♥❧ ✿✿ P❛rs❡r ❛ ✦ P❛rs❡r ✭ ❛ ✦ ❛ ✦ ❛ ✮ ✦ P❛rs❡r ❛ ❝❤❛✐♥❧ ♣ s ❂ do ✥ ♣ ① ②s ✥ ♠❛♥② ✭ do ❢ ♦♣ ✥ s ❀ ② ✥ ♣ ❀ r❡t✉r♥ ✭ ♦♣ ❀ ② ✮ ❣ ✮ r❡t✉r♥ ✭ ❢♦❧❞❧ ✭ ✕ ❛ ✭ ♦♣ ❀ ② ✮ ✦ ❛ ❵ ♦♣ ❵ ② ✮ ① ②s ✮ ❝❤❛✐♥r ✿✿ P❛rs❡r ❛ ✦ P❛rs❡r ✭ ❛ ✦ ❛ ✦ ❛ ✮ ✦ P❛rs❡r ❛ ❝❤❛✐♥r ♣ s ❂ do ②s ✥ ♠❛♥② ✭ do ❢ ② ✥ ♣ ❀ ♦♣ ✥ s ❀ r❡t✉r♥ ✭ ② ❀ ♦♣ ✮ ❣ ✮ ✥ ♣ ① r❡t✉r♥ ✭ ❢♦❧❞r ✭ ✕ ✭ ② ❀ ♦♣ ✮ ❜ ✦ ② ❵ ♦♣ ❵ ❜ ✮ ① ②s ✮
Aritmeetilised avaldised Parser ver. 2 ❡①♣r✷ ✿✿ P❛rs❡r ❊①♣r ❡①♣r✷ ❂ ❝❤❛✐♥❧ t❡r♠✷ ✭ ✭ ❦❡②❝ ’+’ ❃ ❃ r❡t✉r♥ ✭✿✰✿✮✮ ❁ ❥ ❃ ✭ ❦❡②❝ ’-’ ❃ ❃ r❡t✉r♥ ✭✿ � ✿✮✮✮ t❡r♠✷ ✿✿ P❛rs❡r ❊①♣r t❡r♠✷ ❂ ❝❤❛✐♥❧ ❢❛❝t✷ ✭ ✭ ❦❡②❝ ’*’ ❃ ❃ r❡t✉r♥ ✭✿ ✄ ✿✮✮ ❁ ❥ ❃ ✭ ❦❡②❝ ’/’ ❃ ❃ r❡t✉r♥ ✭✿ ❂ ✿✮✮✮ ❢❛❝t✷ ✿✿ P❛rs❡r ❊①♣r ❂ ❝❤❛✐♥r ❛t♦♠✷ ✭ ❦❡②❝ ’^’ ❃ ❃ r❡t✉r♥ ✭✿ ^ ✿✮✮ ❢❛❝t✷ ❛t♦♠✷ ✿✿ P❛rs❡r ❊①♣r ❛t♦♠✷ ❂ do ❢ ✐ ✥ ✐♥t ❀ r❡t✉r♥ ✭ ❈♦♥ ✐ ✮ ❣ ❁ ❥ ❃ ♣❛r❡♥ ❡①♣r✷
Recommend
More recommend