Skip to content
/ jcc Public

Case study of a minimalist C compiler built in JavaScript

Notifications You must be signed in to change notification settings

adrianbrs/jcc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JCC - GNU JavaScript Compiler Collection

Case study of a minimalist C compiler built in JavaScript

Installing dependencies

> npm install

Build & Run

Build

> npm run build

Build (watch mode)

> npm run build:watch

Start

> npm start

or

> npm exec jcc

Start (development mode)

> npm run start:dev

Aliasing

Local

> alias jcc="npm exec jcc"
> jcc --help

Global

> npm link
> jcc --help

Commands

> jcc
Usage: jcc [options] [command]

Case study of a minimalist C compiler built in JavaScript

Options:
  -V, --version                output the version number
  -h, --help                   display help for command

Commands:
  lexeme [options] <filepath>  Extract lexemes from source code
  help [command]               display help for command

Lexemes

> jcc lexeme --help
Usage: jcc lexeme [options] <filepath>

Extract lexemes from source code

Arguments:
  filepath                   Path to source code file

Options:
  -V, --version              output the version number
  -e, --encoding <encoding>  Encoding of source code file (default: "utf-8")
  -ll, --log-level           Minimum log level to display (choices: "error", "warn", "note", "log", "all", "none")
  -h, --help                 display help for command

Example:

> jcc lexeme examples/ExemploParaTabelaDeIdentificadores.c
1017 int "int" [examples/ExemploParaTabelaDeIdentificadores.c:2:4]
2000 identifier "num1" [examples/ExemploParaTabelaDeIdentificadores.c:2:9]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:2:10]
1026 struct "struct" [examples/ExemploParaTabelaDeIdentificadores.c:3:7]
2000 identifier "data" [examples/ExemploParaTabelaDeIdentificadores.c:3:12]
5000 l_brace "{" [examples/ExemploParaTabelaDeIdentificadores.c:4:2]
1017 int "int" [examples/ExemploParaTabelaDeIdentificadores.c:5:8]
2000 identifier "dia" [examples/ExemploParaTabelaDeIdentificadores.c:5:12]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:5:13]
1017 int "int" [examples/ExemploParaTabelaDeIdentificadores.c:6:8]
2000 identifier "mes" [examples/ExemploParaTabelaDeIdentificadores.c:6:12]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:6:13]
1017 int "int" [examples/ExemploParaTabelaDeIdentificadores.c:7:8]
2000 identifier "ano" [examples/ExemploParaTabelaDeIdentificadores.c:7:12]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:7:13]
5001 r_brace "}" [examples/ExemploParaTabelaDeIdentificadores.c:8:2]
2000 identifier "datanasc" [examples/ExemploParaTabelaDeIdentificadores.c:8:11]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:8:12]
1012 float "float" [examples/ExemploParaTabelaDeIdentificadores.c:10:6]
2000 identifier "calcula" [examples/ExemploParaTabelaDeIdentificadores.c:10:14]
5004 l_paren "(" [examples/ExemploParaTabelaDeIdentificadores.c:10:15]
1017 int "int" [examples/ExemploParaTabelaDeIdentificadores.c:10:18]
2000 identifier "p1" [examples/ExemploParaTabelaDeIdentificadores.c:10:21]
5008 comma "," [examples/ExemploParaTabelaDeIdentificadores.c:10:22]
1017 int "int" [examples/ExemploParaTabelaDeIdentificadores.c:10:26]
5021 star "*" [examples/ExemploParaTabelaDeIdentificadores.c:10:28]
2000 identifier "p2" [examples/ExemploParaTabelaDeIdentificadores.c:10:30]
5005 r_paren ")" [examples/ExemploParaTabelaDeIdentificadores.c:10:31]
5000 l_brace "{" [examples/ExemploParaTabelaDeIdentificadores.c:11:2]
1017 int "int" [examples/ExemploParaTabelaDeIdentificadores.c:12:8]
2000 identifier "r" [examples/ExemploParaTabelaDeIdentificadores.c:12:10]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:12:11]
2000 identifier "r" [examples/ExemploParaTabelaDeIdentificadores.c:13:6]
5011 equal "=" [examples/ExemploParaTabelaDeIdentificadores.c:13:8]
2000 identifier "p1" [examples/ExemploParaTabelaDeIdentificadores.c:13:11]
5021 star "*" [examples/ExemploParaTabelaDeIdentificadores.c:13:13]
2000 identifier "p2" [examples/ExemploParaTabelaDeIdentificadores.c:13:16]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:13:17]
1021 return "return" [examples/ExemploParaTabelaDeIdentificadores.c:14:11]
2000 identifier "r" [examples/ExemploParaTabelaDeIdentificadores.c:14:13]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:14:14]
5001 r_brace "}" [examples/ExemploParaTabelaDeIdentificadores.c:15:2]
1017 int "int" [examples/ExemploParaTabelaDeIdentificadores.c:16:4]
2000 identifier "main" [examples/ExemploParaTabelaDeIdentificadores.c:16:9]
5004 l_paren "(" [examples/ExemploParaTabelaDeIdentificadores.c:16:10]
5005 r_paren ")" [examples/ExemploParaTabelaDeIdentificadores.c:16:11]
5000 l_brace "{" [examples/ExemploParaTabelaDeIdentificadores.c:17:2]
1003 char "char" [examples/ExemploParaTabelaDeIdentificadores.c:18:9]
2000 identifier "livro" [examples/ExemploParaTabelaDeIdentificadores.c:18:15]
5002 l_bracket "[" [examples/ExemploParaTabelaDeIdentificadores.c:18:16]
3000 number_literal "100" [examples/ExemploParaTabelaDeIdentificadores.c:18:19]
5003 r_bracket "]" [examples/ExemploParaTabelaDeIdentificadores.c:18:20]
5002 l_bracket "[" [examples/ExemploParaTabelaDeIdentificadores.c:18:21]
3000 number_literal "255" [examples/ExemploParaTabelaDeIdentificadores.c:18:24]
5003 r_bracket "]" [examples/ExemploParaTabelaDeIdentificadores.c:18:25]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:18:26]
1017 int "int" [examples/ExemploParaTabelaDeIdentificadores.c:19:8]
2000 identifier "num1" [examples/ExemploParaTabelaDeIdentificadores.c:19:13]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:19:14]
1012 float "float" [examples/ExemploParaTabelaDeIdentificadores.c:20:10]
2000 identifier "num2" [examples/ExemploParaTabelaDeIdentificadores.c:20:15]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:20:16]
2000 identifier "num2" [examples/ExemploParaTabelaDeIdentificadores.c:21:9]
5011 equal "=" [examples/ExemploParaTabelaDeIdentificadores.c:21:11]
2000 identifier "calcula" [examples/ExemploParaTabelaDeIdentificadores.c:21:19]
5004 l_paren "(" [examples/ExemploParaTabelaDeIdentificadores.c:21:20]
2000 identifier "num1" [examples/ExemploParaTabelaDeIdentificadores.c:21:24]
5008 comma "," [examples/ExemploParaTabelaDeIdentificadores.c:21:25]
2000 identifier "num2" [examples/ExemploParaTabelaDeIdentificadores.c:21:30]
5005 r_paren ")" [examples/ExemploParaTabelaDeIdentificadores.c:21:31]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:21:32]
1015 if "if" [examples/ExemploParaTabelaDeIdentificadores.c:22:7]
5004 l_paren "(" [examples/ExemploParaTabelaDeIdentificadores.c:22:9]
2000 identifier "num2" [examples/ExemploParaTabelaDeIdentificadores.c:22:13]
5005 r_paren ")" [examples/ExemploParaTabelaDeIdentificadores.c:22:14]
5000 l_brace "{" [examples/ExemploParaTabelaDeIdentificadores.c:23:6]
1017 int "int" [examples/ExemploParaTabelaDeIdentificadores.c:24:12]
2000 identifier "p1" [examples/ExemploParaTabelaDeIdentificadores.c:24:15]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:24:16]
2000 identifier "p1" [examples/ExemploParaTabelaDeIdentificadores.c:25:11]
5015 slash_equal "/=" [examples/ExemploParaTabelaDeIdentificadores.c:25:14]
2000 identifier "num2" [examples/ExemploParaTabelaDeIdentificadores.c:25:19]
5009 semicolon ";" [examples/ExemploParaTabelaDeIdentificadores.c:25:20]
5001 r_brace "}" [examples/ExemploParaTabelaDeIdentificadores.c:26:6]
5001 r_brace "}" [examples/ExemploParaTabelaDeIdentificadores.c:27:2]

Syntax analysis

> jcc sint --help
Usage: jcc sint [options] <filepath>

Perform syntactic analysis on the source file

Arguments:
  filepath                   Path to source code file

Options:
  -e, --encoding <encoding>  Encoding of source code file (default: "utf-8")
  -h, --help                 display help for command

Example

Uncomment some errors in the example file and run the syntax analyzer to view the error messages.

> npm run sint:example
0: int []
0: TYPE_PRIMITIVE []
0: TYPE []
0: TYPE identifier []
0: SINGLE_DECLARATION []
0: DECLARATION []
0: DECLARATION equal []
0: DECLARATION equal number_literal []
0: DECLARATION equal EXPRESSION []
0: DECLARATION_ASSIGNMENT []
...
0: STATEMENT DECLARATION []
0: STATEMENT DECLARATION semicolon []
examples/example.c:7:7(utf-8): error: conflicting types for 'a'; have 'float'
7 | float a;
  |       ^

Releases

No releases published

Packages

No packages published