Brief introduction

In this project we implemented a compiler for a new grammar. CUP and LLVM are the tools that we used for implementation. Tests were also designed with JUnit. This project had three main phases. The first phase was implementing a lexical analyser for the given grammar. After that we implemented the parser using CUPS in java. The last phase was implementing the code generator which was done in LLVM.

Source Code

Compiler Grammar

βŒ©π‘π‘Ÿπ‘œπ‘”π‘Ÿπ‘Žπ‘šβŒͺ β†’ {βŒ©π‘£π‘Žπ‘Ÿ_𝑑𝑐𝑙βŒͺβˆ— | βŒ©π‘“π‘’π‘›π‘_𝑒π‘₯π‘‘π‘’π‘Ÿπ‘›βŒͺβˆ— |βŒ©π‘ π‘‘π‘Ÿπ‘’π‘π‘‘_𝑑𝑒𝑐βŒͺβˆ— } +

βŒ©π‘“π‘’π‘›π‘_𝑒π‘₯π‘‘π‘’π‘Ÿπ‘›βŒͺ β†’ βŒ©π‘“π‘’π‘›π‘_𝑑𝑐𝑙βŒͺ | βŒ©π‘’π‘₯π‘‘π‘’π‘Ÿπ‘›_𝑑𝑐𝑙βŒͺ

βŒ©π‘“π‘’π‘›π‘_𝑑𝑐𝑙βŒͺ β†’ βŒ©π‘‘π‘¦π‘π‘’βŒͺπ’Šπ’… ([βŒ©π‘Žπ‘Ÿπ‘”π‘’π‘šπ‘’π‘›π‘‘π‘ βŒͺ]) ; | βŒ©π‘‘π‘¦π‘π‘’βŒͺπ’Šπ’… (βŒ©π‘Žπ‘Ÿπ‘”π‘’π‘šπ‘’π‘›π‘‘π‘ βŒͺ]) βŒ©π‘π‘™π‘œπ‘π‘˜βŒͺ

βŒ©π‘’π‘₯π‘‘π‘’π‘Ÿπ‘›_𝑑𝑐𝑙βŒͺ β†’ π’†π’™π’•π’†π’“π’βŒ©π‘‘π‘¦π‘π‘’βŒͺπ’Šπ’… ;

βŒ©π‘Žπ‘Ÿπ‘”π‘’π‘šπ‘’π‘›π‘‘π‘ βŒͺ β†’ βŒ©π‘‘π‘¦π‘π‘’βŒͺ π’Šπ’… [{ β€²[β€² β€²]β€² } + ] [, βŒ©π‘Žπ‘Ÿπ‘”π‘’π‘šπ‘’π‘›π‘‘π‘ βŒͺ]

βŒ©π‘‘π‘¦π‘π‘’βŒͺ β†’ π’Šπ’π’• | 𝒃𝒐𝒐𝒍 | 𝒇𝒍𝒐𝒂𝒕 | π’π’π’π’ˆ | 𝒄𝒉𝒂𝒓 | 𝒅𝒐𝒖𝒃𝒍𝒆 | π’Šπ’… | π’”π’•π’“π’Šπ’π’ˆ | π’—π’π’Šπ’… | π’‚π’–π’•π’βŒ©π‘ π‘‘π‘Ÿπ‘’π‘π‘‘_𝑑𝑒𝑐βŒͺ β†’ π’“π’†π’„π’π’“π’…π’Šπ’…π’ƒπ’†π’ˆπ’Šπ’βŒ©π‘£π‘Žπ‘Ÿ_𝑑𝑐𝑙βŒͺ + 𝒆𝒏𝒅𝒓𝒆𝒄𝒐𝒓𝒅 ;

βŒ©π‘£π‘Žπ‘Ÿ_𝑑𝑐𝑙βŒͺ β†’ [𝒄𝒐𝒏𝒔𝒕] βŒ©π‘‘π‘¦π‘π‘’βŒͺβŒ©π‘£π‘Žπ‘Ÿ_𝑑𝑐𝑙_𝑐𝑛𝑑βŒͺ [,βŒ©π‘£π‘Žπ‘Ÿ_𝑑𝑐𝑙_𝑐𝑛𝑑βŒͺ] βˆ— ;

βŒ©π‘£π‘Žπ‘Ÿ_𝑑𝑐𝑙_𝑐𝑛𝑑βŒͺ β†’ βŒ©π‘£π‘Žπ‘Ÿπ‘–π‘Žπ‘π‘™π‘’βŒͺ [= {βŒ©π‘’π‘₯π‘π‘ŸβŒͺ}]

βŒ©π‘π‘™π‘œπ‘π‘˜βŒͺ β†’ β€²π’ƒπ’†π’ˆπ’Šπ’β€² { βŒ©π‘£π‘Žπ‘Ÿ_𝑑𝑐𝑙βŒͺ | βŒ©π‘ π‘‘π‘Žπ‘‘π‘’π‘šπ‘’π‘›π‘‘βŒͺ } βˆ— ′𝒆𝒏𝒅′

βŒ©π‘ π‘‘π‘Žπ‘‘π‘’π‘šπ‘’π‘›π‘‘βŒͺ β†’ βŒ©π‘Žπ‘ π‘ π‘–π‘”π‘›π‘šπ‘’π‘›π‘‘βŒͺ | βŒ©π‘šπ‘’π‘‘β„Žπ‘œπ‘‘_π‘π‘Žπ‘™π‘™βŒͺ ; | βŒ©π‘π‘œπ‘›π‘‘_π‘ π‘‘π‘šπ‘‘βŒͺ | βŒ©π‘™π‘œπ‘œπ‘_π‘ π‘‘π‘šπ‘‘βŒͺ | 𝒓𝒆𝒕𝒖𝒓𝒏 [βŒ©π‘’π‘₯π‘π‘ŸβŒͺ]; | π’ƒπ’“π’†π’‚π’Œ ; | π’„π’π’π’•π’Šπ’π’–π’† ; | π’”π’Šπ’›π’†π’π’‡(βŒ©π‘‘π‘¦π‘π‘’βŒͺ)

βŒ©π‘Žπ‘ π‘ π‘–π‘”π‘›π‘šπ‘’π‘›π‘‘βŒͺ β†’ βŒ©π‘£π‘Žπ‘Ÿπ‘–π‘Žπ‘π‘™π‘’βŒͺ = βŒ©π‘’π‘₯π‘π‘ŸβŒͺ

βŒ©π‘šπ‘’π‘‘β„Žπ‘œπ‘‘_π‘π‘Žπ‘™π‘™βŒͺ β†’ π’Šπ’… ([βŒ©π‘π‘Žπ‘Ÿπ‘Žπ‘šπ‘’π‘‘π‘’π‘Ÿπ‘ βŒͺ])

βŒ©π‘π‘Žπ‘Ÿπ‘Žπ‘šπ‘’π‘‘π‘’π‘Ÿπ‘ βŒͺ β†’ βŒ©π‘’π‘₯π‘π‘ŸβŒͺ | βŒ©π‘’π‘₯π‘π‘ŸβŒͺ, βŒ©π‘π‘Žπ‘Ÿπ‘Žπ‘šπ‘’π‘‘π‘’π‘Ÿπ‘ βŒͺ

βŒ©π‘π‘œπ‘›π‘‘_π‘ π‘‘π‘šπ‘‘βŒͺ β†’ π’Šπ’‡ (βŒ©π‘’π‘₯π‘π‘ŸβŒͺβŒ©π‘π‘™π‘œπ‘π‘˜βŒͺ [π’†π’π’”π’†βŒ©π‘π‘™π‘œπ‘π‘˜βŒͺ] | π’”π’˜π’Šπ’•π’„π’‰ (π’Šπ’…) π’π’‡βˆΆβ€²{β€² [{𝒄𝒂𝒔𝒆 π’Šπ’π’•_π’„π’π’π’”π’•βˆΆβŒ©π‘π‘™π‘œπ‘π‘˜βŒͺ} βˆ—] βˆ—π’…π’†π’‡π’‚π’–π’π’•: βŒ©π‘π‘™π‘œπ‘π‘˜βŒͺ β€²}β€²

βŒ©π‘™π‘œπ‘œπ‘_π‘ π‘‘π‘šπ‘‘βŒͺ β†’ 𝒇𝒐𝒓 ([βŒ©π‘£π‘Žπ‘Ÿ_𝑑𝑐𝑙βŒͺ] ; βŒ©π‘’π‘₯π‘π‘ŸβŒͺ ; [βŒ©π‘Žπ‘ π‘ π‘–π‘”π‘›π‘šπ‘’π‘›π‘‘βŒͺ | βŒ©π‘’π‘₯π‘π‘ŸβŒͺ]) βŒ©π‘π‘™π‘œπ‘π‘˜βŒͺ | π’“π’†π’‘π’†π’‚π’•βŒ©π‘π‘™π‘œπ‘π‘˜βŒͺπ’–π’π’•π’Šπ’ (βŒ©π‘’π‘₯π‘π‘ŸβŒͺ); | 𝒇𝒐𝒓𝒆𝒂𝒄𝒉(π’Šπ’…π’Šπ’π’Šπ’…) βŒ©π‘π‘™π‘œπ‘π‘˜βŒͺ

βŒ©π‘’π‘₯π‘π‘ŸβŒͺ β†’ βŒ©π‘’π‘₯π‘π‘ŸβŒͺ βŒ©π‘π‘–π‘›π‘Žπ‘Ÿπ‘¦_π‘œπ‘βŒͺβŒ©π‘’π‘₯π‘π‘ŸβŒͺ | (βŒ©π‘’π‘₯π‘π‘ŸβŒͺ) | βŒ©π‘šπ‘’π‘‘β„Žπ‘œπ‘‘_π‘π‘Žπ‘™π‘™βŒͺ | βŒ©π‘£π‘Žπ‘Ÿπ‘–π‘Žπ‘π‘™π‘’βŒͺ | βŒ©π‘π‘œπ‘›π‘ π‘‘_π‘£π‘Žπ‘™βŒͺ | βˆ’ βŒ©π‘’π‘₯π‘π‘ŸβŒͺ | ! βŒ©π‘’π‘₯π‘π‘ŸβŒͺ

βŒ©π‘£π‘Žπ‘Ÿπ‘–π‘Žπ‘π‘™π‘’βŒͺ β†’ π’Šπ’… [{ β€²[β€² βŒ©π‘’π‘₯π‘π‘ŸβŒͺ β€²]β€² } +] | ~βŒ©π‘£π‘Žπ‘Ÿπ‘–π‘Žπ‘π‘™π‘’βŒͺ | βˆ’ βˆ’βŒ©π‘£π‘Žπ‘Ÿπ‘–π‘Žπ‘π‘™π‘’βŒͺ | + +βŒ©π‘£π‘Žπ‘Ÿπ‘–π‘Žπ‘π‘™π‘’βŒͺ | βŒ©π‘£π‘Žπ‘Ÿπ‘–π‘Žπ‘π‘™π‘’βŒͺ βˆ’ βˆ’ | βŒ©π‘£π‘Žπ‘Ÿπ‘–π‘Žπ‘π‘™π‘’βŒͺ + +

βŒ©π‘π‘–π‘›π‘Žπ‘Ÿπ‘¦_π‘œπ‘βŒͺ β†’ βŒ©π‘Žπ‘Ÿπ‘–π‘‘β„Žπ‘šπ‘Žπ‘‘π‘–π‘βŒͺ | βŒ©π‘π‘œπ‘›π‘‘π‘–π‘‘π‘–π‘œπ‘›π‘Žπ‘™βŒͺ

βŒ©π‘Žπ‘Ÿπ‘–π‘‘β„Žπ‘šπ‘Žπ‘‘π‘–π‘βŒͺ β†’ + | βˆ’ | βˆ— | / | % | & | β€²|β€² | ^ |

βŒ©π‘π‘œπ‘›π‘‘π‘–π‘‘π‘–π‘œπ‘›π‘Žπ‘™βŒͺ β†’ == | ! = | >= | <=| < | > | and | or | not

βŒ©π‘π‘œπ‘›π‘ π‘‘_π‘£π‘Žπ‘™βŒͺ β†’ π’Šπ’π’•_𝒄𝒐𝒏𝒔𝒕 | 𝒓𝒆𝒂𝒍_𝒄𝒐𝒏𝒔𝒕 | 𝒄𝒉𝒂𝒓_𝒄𝒐𝒏𝒔𝒕 | 𝒃𝒐𝒐𝒍_𝒄𝒐𝒏𝒔𝒕 | π’”π’•π’“π’Šπ’π’ˆ_𝒄𝒐𝒏𝒔𝒕 | π’π’π’π’ˆ_𝒄𝒐𝒏𝒔t