BasicCompiler

A compiler with very basic capabilities written in Swift. This project is not intended for real-world use; it’s implemented just for fun.

The desired language syntax is described in the following EBNF:

prg               = prgHeader varDefs "begin" statementSeq "end" "."
prgHeader         = "program" identifier ";"
varDefs           = [ "var" varSeq { varSeq } ]
varSeq            = identifier { "," identifier } : type ";"
type              = "integer" | "string"
statementSeq      = { ( simpleAssignment | complexAssignment) ";" }
simpleAssignment  = identifier ":=" operand ";"
complexAssignment = identifier ":=" operand mathOP operand ";"
operand           = identifier | number
mathOp            = "+" | "-"

Prerequisites

  • Install the lates version of Swift. Please follow the instructions.
  • Install the lates version of Make. Please follow the instructions
  • Install the lates version of Ubuntu. Please follow the instructions

Instructions

  1. Download or clone the project.
  2. Go to the root folder and run cd BasicCompiler.
  3. Run make all to build the package.
  4. Run make test to test the package.

Build-time error handling

BasicCompiler is capable of handling all the errors mentioned below by providing user-readable messages:

  • Parser errors

    • When the lexeme exceeds the predefined max lexeme length, with additional info (line, offset)
    • When a string literal is not closed, with additional info (line, offset)
    • When an unsupported symbol appears, with additional info (line, offset, unupported_symbol)
    • When an invalid lexeme is detected, with additional info (line, offset, invalid_lexeme)
  • Compiler errors

    • When expected to find the end of the program but found another token instead, with additional info (unexpected_token)
    • When expected to find a token but found the end of the program
    • When an unexpected (wrong) token has been found, with additional info (unexpected_token)
    • When a variable is declared more than once, with additional info (variable_name)
    • When trying to use a variable without declaring it, with additional info (variable_name)
    • When trying to assign a variable with a wrong type, with additional info (expected_type, given_type)
    • When trying to use an unsupported type, with additional info (unsupported_type)
    • When trying to use an uninitialized variable, with additional info (variable_name)
  • File errors

    • When the source file is not provided
    • When the provided source file doesn’t exist
    • When the provided source file can’t be read
    • When the output file can’t be written
  • Other errors

    • All other errors, with auto-generated messages

Optimizations

If both operands of the complexAssignment are literals, the value will be calculated at build-time, and the result will be assigned as simpleAssignment.

Disclaimer

Alternatively, generate the assembly file swift run BasicCompiler $(INPUT_FILE) then compile and run it using an online IDE to check the results.

GitHub

View Github