Skip to content

musgravejw/ruby-compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

159 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Compiler Build Status

This is a project written in Ruby to demonstrate compiler theory concepts. The compiler is a single pass LL(1) recursive descent compiler built from a custom grammar.

Usage

rake will build everything in the 'tests' dir.

rake clean to clear 'target' dir.

compiler
    ├── README.md
    ├── compiler.rb
    ├── rakefile
    ├── src
    │   ├── code_gen.rb
    │   ├── parser.rb
    │   ├── runtime.rb
    │   ├── scanner.rb
    │   └── semantic.rb
    └── tests
        └── correct
            ├── fromJake.src
            ├── test_heap.src
            ├── test_program.src
            ├── test_program_array.src
            ├── test_program_minimal.src
            └── test_program_with_errors.src

3 directories, 14 files

Language

<program> ::=
    <program_header> <program_body>

<program_header> ::=
    program <identifier> is

<program_body> ::=
        ( <declaration> ; )*
    begin
        ( <statement> ; )*
    end program

<declaration> ::=
    [ global ] <procedure_declaration>
    [ global ] <variable_declaration>

<variable_declaration> ::=
    <type_mark> <identifier> [ [ <array_size> ] ]

<type_mark> ::=
    integer |
    float |
    bool |
    string

<procedure_declaration> ::=
    <procedure_header> <procedure_body>

<procedure_header> ::=
    procedure <identifier> ( [ <parameter_list> ] )

<procedure_body> ::=
        ( <declaration> ; )*
    begin
        ( <statement ; )*
    end procedure

<parameter_list> ::=
    <parameter> , <parameter_list> |
    <parameter>

<parameter> ::=
    <variable_declaration> ( in | out )

<statement> ::=
    <assignment_statement> |
    <if_statement> |
    <loop_statement> |
    <return_statement> |
    <procedure_call>

<assignment_statement> ::=
    <destination> := <expression>

<if_statement> ::=
    if ( <expression> ) then ( <statement> ; )+
    [ else ( <statement> ; )+ ]
    end if

<loop_statement> ::=
    for ( <assignment_statement> ; <expression> )
        ( <statement> ; )*
    end for

<procedure_call> ::=
    <identifier> ( [ <argument_list> ] )

<argument_list> ::=
    <expression> , <argument_list> |
    <expression>

<destination> ::=
    <identifier> [ [ <expression> ] ]

<expression> ::=
    <expression> & <arith_op> |
    <expression> | <arith_op> |
    [ not ] <arith_op>

<arith_op> ::=
    <arith_op> + <relation> |
    <arith_op> - <relation> |
    <relation>

<relation> ::=
    <relation> < <term> |
    <relation> > <term> |
    <relation> >= <term> |
    <relation> <= <term> |
    <relation> == <term> |
    <relation> != <term> |
    <term>

<term> ::=
    <term> * <factor> |
    <term> / <factor> |
    <factor>

<factor> ::=
    ( <expression> ) |
    [ - ] <name> |
    [ - ] <number> |
    <string> |
    true |
    false |

<name> ::=
    <identifier> [ [ <expression> ] ]

<identifier> ::=
    [a-zA-Z][a-zA-Z0-9_]*

<number> ::=
    [0-9][0-9_]*[.[0-9_]*]?

<string> ::=
    "[a-zA-Z0-9 _,;:.]*"

Author

Written by John Musgrave.

License

Licensed under the MIT License

About

Single pass LL(1) recursive descent compiler written in Ruby.

Topics

Resources

License

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages