Skip to content

TheCookiess/rust-compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

70 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

an attempt at making a compiler in rust!

Future "Valid Syntax", negative whitespace significant indentation!

          hhh {
        eee {
      aaa {
   ddd {
aaa }
  ccc } 
    hhh }
      eee }

Core Functionality Required:

  • variables WITH DATA TYPES
  • operations: (boolean, logical//bitwise, binary)
  • control flow branches: (if/else)
  • loops: (while/for)
  • types
  • functions: (recursion << should be free?)
  • array
  • user defined struct

Currently working on:

  • if
    • rework lexer to handle multi-symbol keywords (i.e "==" or "<=")
    • parse boolean comparison
    • else & else if parsing
    • code generation
      • invert 'jump' conditions
      • unsigned vs signed comparison (diff jump instructions) (no types, all signed)
      • binary expr conditions
        • conditional expr, either has explicity bool comparison or implicit, expr = lhs: (lhs > 0)
        • cmp reg1, reg2 ; compare arguments
        • set(EQUIVALENCE e.g e, le) al; sets register 'al' (8 bit) to 1,0 depending on cmp flag
        • movzx output_reg, al ; Move Zero Xtend. copies 'al' into 'output_reg' && zero init reg1 bits.
    • types of scope
      • inherits variables from parent scope (if, else if, else)
      • doesn't (new function, UNLESS class, inherits 'self')
  • (kinda done) split 'TokenKind': 'Symbol' .. 'LogicalOp' .. 'BinaryOp' .. etc
  • comments
  • re-design multi-symbol in Lexer: match against longest multi-symbol to shortest, until finds match (or illegal token.)
  • update grammar to match code.
  • variable reassignment (mutability)
  • Operators
    • modulus '%' op
    • Associativity
    • binary
    • logical
      • i.e: if (5) | 5 != 0 so -> if (true)
      • i.e: if (!5) | 5 == 0 so -> if (false)
      • eval expr, jump if zero. << un-optimal, uses 'al' reg when not necessary
    • bitwise
    • unary
      • LogicalNot
      • BitwiseNot
  • dynamically place variables on stack if they are(nt) used immediately.
    • don't push pop every intlit/var, use registers!
  • Testing infrastructure.
  • data types
    • primitives
    • pointers // get mem location of a val.
    • structs
    • arrays // just heap pointers?
  • functions
    • return type
    • arguments
    • body
    • program entry point ("main")
  • Implement C equivalent operators:
    • comma: ','
    • assignment: '=' | '+=' | '/=' | ..
    • modulus: %
    • logical not: !
    • unary minus: i.e -10
    • function call: '()'
    • array subscript: '[]'
    • struct member: '.' | '->'
    • Increment/Decrement (OPTIONAL)
    • cast: (type)
  • (Joke mode:) negative whitespace significance, the most nested piece of code has 0 indentations, everything out has an indentation.
    • compiler error on uppercase

About

First attempt at making a compiler

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published