{"id":19586456,"url":"https://github.com/adrianbrs/jcc","last_synced_at":"2026-05-06T00:05:54.264Z","repository":{"id":191507629,"uuid":"684793345","full_name":"adrianbrs/jcc","owner":"adrianbrs","description":"Case study of a minimalist C compiler built in JavaScript","archived":false,"fork":false,"pushed_at":"2023-12-06T03:31:03.000Z","size":172,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-26T02:49:25.650Z","etag":null,"topics":["case-study","compilers","gcc","javascript","lexical-analysis","nodejs","strings"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adrianbrs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-08-29T21:41:53.000Z","updated_at":"2023-10-10T20:28:48.000Z","dependencies_parsed_at":"2023-10-21T01:35:11.737Z","dependency_job_id":"8b69481a-3c5a-4297-9bad-5b08c9822895","html_url":"https://github.com/adrianbrs/jcc","commit_stats":null,"previous_names":["adrianbrs/jcc"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrianbrs%2Fjcc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrianbrs%2Fjcc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrianbrs%2Fjcc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrianbrs%2Fjcc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adrianbrs","download_url":"https://codeload.github.com/adrianbrs/jcc/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240858577,"owners_count":19868998,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["case-study","compilers","gcc","javascript","lexical-analysis","nodejs","strings"],"created_at":"2024-11-11T07:59:53.942Z","updated_at":"2026-05-06T00:05:49.242Z","avatar_url":"https://github.com/adrianbrs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JCC - ~~GNU~~ JavaScript Compiler Collection\n\n\u003e Case study of a minimalist C compiler built in JavaScript\n\n### Installing dependencies\n\n```bash\n\u003e npm install\n```\n\n### Build \u0026 Run\n\n#### Build\n\n```bash\n\u003e npm run build\n```\n\n#### Build (watch mode)\n\n```bash\n\u003e npm run build:watch\n```\n\n#### Start\n\n```bash\n\u003e npm start\n```\n\nor\n\n```bash\n\u003e npm exec jcc\n```\n\n#### Start (development mode)\n\n```bash\n\u003e npm run start:dev\n```\n\n### Aliasing\n\n#### Local\n\n```bash\n\u003e alias jcc=\"npm exec jcc\"\n\u003e jcc --help\n```\n\n#### Global\n\n```bash\n\u003e npm link\n\u003e jcc --help\n```\n\n## Commands\n\n```bash\n\u003e jcc\nUsage: jcc [options] [command]\n\nCase study of a minimalist C compiler built in JavaScript\n\nOptions:\n  -V, --version                output the version number\n  -h, --help                   display help for command\n\nCommands:\n  lexeme [options] \u003cfilepath\u003e  Extract lexemes from source code\n  help [command]               display help for command\n```\n\n### Lexemes\n\n```bash\n\u003e jcc lexeme --help\nUsage: jcc lexeme [options] \u003cfilepath\u003e\n\nExtract lexemes from source code\n\nArguments:\n  filepath                   Path to source code file\n\nOptions:\n  -V, --version              output the version number\n  -e, --encoding \u003cencoding\u003e  Encoding of source code file (default: \"utf-8\")\n  -ll, --log-level           Minimum log level to display (choices: \"error\", \"warn\", \"note\", \"log\", \"all\", \"none\")\n  -h, --help                 display help for command\n```\n\nExample:\n\n```bash\n\u003e jcc lexeme examples/ExemploParaTabelaDeIdentificadores.c\n1017 int \"int\" [examples/ExemploParaTabelaDeIdentificadores.c:2:4]\n2000 identifier \"num1\" [examples/ExemploParaTabelaDeIdentificadores.c:2:9]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:2:10]\n1026 struct \"struct\" [examples/ExemploParaTabelaDeIdentificadores.c:3:7]\n2000 identifier \"data\" [examples/ExemploParaTabelaDeIdentificadores.c:3:12]\n5000 l_brace \"{\" [examples/ExemploParaTabelaDeIdentificadores.c:4:2]\n1017 int \"int\" [examples/ExemploParaTabelaDeIdentificadores.c:5:8]\n2000 identifier \"dia\" [examples/ExemploParaTabelaDeIdentificadores.c:5:12]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:5:13]\n1017 int \"int\" [examples/ExemploParaTabelaDeIdentificadores.c:6:8]\n2000 identifier \"mes\" [examples/ExemploParaTabelaDeIdentificadores.c:6:12]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:6:13]\n1017 int \"int\" [examples/ExemploParaTabelaDeIdentificadores.c:7:8]\n2000 identifier \"ano\" [examples/ExemploParaTabelaDeIdentificadores.c:7:12]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:7:13]\n5001 r_brace \"}\" [examples/ExemploParaTabelaDeIdentificadores.c:8:2]\n2000 identifier \"datanasc\" [examples/ExemploParaTabelaDeIdentificadores.c:8:11]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:8:12]\n1012 float \"float\" [examples/ExemploParaTabelaDeIdentificadores.c:10:6]\n2000 identifier \"calcula\" [examples/ExemploParaTabelaDeIdentificadores.c:10:14]\n5004 l_paren \"(\" [examples/ExemploParaTabelaDeIdentificadores.c:10:15]\n1017 int \"int\" [examples/ExemploParaTabelaDeIdentificadores.c:10:18]\n2000 identifier \"p1\" [examples/ExemploParaTabelaDeIdentificadores.c:10:21]\n5008 comma \",\" [examples/ExemploParaTabelaDeIdentificadores.c:10:22]\n1017 int \"int\" [examples/ExemploParaTabelaDeIdentificadores.c:10:26]\n5021 star \"*\" [examples/ExemploParaTabelaDeIdentificadores.c:10:28]\n2000 identifier \"p2\" [examples/ExemploParaTabelaDeIdentificadores.c:10:30]\n5005 r_paren \")\" [examples/ExemploParaTabelaDeIdentificadores.c:10:31]\n5000 l_brace \"{\" [examples/ExemploParaTabelaDeIdentificadores.c:11:2]\n1017 int \"int\" [examples/ExemploParaTabelaDeIdentificadores.c:12:8]\n2000 identifier \"r\" [examples/ExemploParaTabelaDeIdentificadores.c:12:10]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:12:11]\n2000 identifier \"r\" [examples/ExemploParaTabelaDeIdentificadores.c:13:6]\n5011 equal \"=\" [examples/ExemploParaTabelaDeIdentificadores.c:13:8]\n2000 identifier \"p1\" [examples/ExemploParaTabelaDeIdentificadores.c:13:11]\n5021 star \"*\" [examples/ExemploParaTabelaDeIdentificadores.c:13:13]\n2000 identifier \"p2\" [examples/ExemploParaTabelaDeIdentificadores.c:13:16]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:13:17]\n1021 return \"return\" [examples/ExemploParaTabelaDeIdentificadores.c:14:11]\n2000 identifier \"r\" [examples/ExemploParaTabelaDeIdentificadores.c:14:13]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:14:14]\n5001 r_brace \"}\" [examples/ExemploParaTabelaDeIdentificadores.c:15:2]\n1017 int \"int\" [examples/ExemploParaTabelaDeIdentificadores.c:16:4]\n2000 identifier \"main\" [examples/ExemploParaTabelaDeIdentificadores.c:16:9]\n5004 l_paren \"(\" [examples/ExemploParaTabelaDeIdentificadores.c:16:10]\n5005 r_paren \")\" [examples/ExemploParaTabelaDeIdentificadores.c:16:11]\n5000 l_brace \"{\" [examples/ExemploParaTabelaDeIdentificadores.c:17:2]\n1003 char \"char\" [examples/ExemploParaTabelaDeIdentificadores.c:18:9]\n2000 identifier \"livro\" [examples/ExemploParaTabelaDeIdentificadores.c:18:15]\n5002 l_bracket \"[\" [examples/ExemploParaTabelaDeIdentificadores.c:18:16]\n3000 number_literal \"100\" [examples/ExemploParaTabelaDeIdentificadores.c:18:19]\n5003 r_bracket \"]\" [examples/ExemploParaTabelaDeIdentificadores.c:18:20]\n5002 l_bracket \"[\" [examples/ExemploParaTabelaDeIdentificadores.c:18:21]\n3000 number_literal \"255\" [examples/ExemploParaTabelaDeIdentificadores.c:18:24]\n5003 r_bracket \"]\" [examples/ExemploParaTabelaDeIdentificadores.c:18:25]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:18:26]\n1017 int \"int\" [examples/ExemploParaTabelaDeIdentificadores.c:19:8]\n2000 identifier \"num1\" [examples/ExemploParaTabelaDeIdentificadores.c:19:13]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:19:14]\n1012 float \"float\" [examples/ExemploParaTabelaDeIdentificadores.c:20:10]\n2000 identifier \"num2\" [examples/ExemploParaTabelaDeIdentificadores.c:20:15]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:20:16]\n2000 identifier \"num2\" [examples/ExemploParaTabelaDeIdentificadores.c:21:9]\n5011 equal \"=\" [examples/ExemploParaTabelaDeIdentificadores.c:21:11]\n2000 identifier \"calcula\" [examples/ExemploParaTabelaDeIdentificadores.c:21:19]\n5004 l_paren \"(\" [examples/ExemploParaTabelaDeIdentificadores.c:21:20]\n2000 identifier \"num1\" [examples/ExemploParaTabelaDeIdentificadores.c:21:24]\n5008 comma \",\" [examples/ExemploParaTabelaDeIdentificadores.c:21:25]\n2000 identifier \"num2\" [examples/ExemploParaTabelaDeIdentificadores.c:21:30]\n5005 r_paren \")\" [examples/ExemploParaTabelaDeIdentificadores.c:21:31]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:21:32]\n1015 if \"if\" [examples/ExemploParaTabelaDeIdentificadores.c:22:7]\n5004 l_paren \"(\" [examples/ExemploParaTabelaDeIdentificadores.c:22:9]\n2000 identifier \"num2\" [examples/ExemploParaTabelaDeIdentificadores.c:22:13]\n5005 r_paren \")\" [examples/ExemploParaTabelaDeIdentificadores.c:22:14]\n5000 l_brace \"{\" [examples/ExemploParaTabelaDeIdentificadores.c:23:6]\n1017 int \"int\" [examples/ExemploParaTabelaDeIdentificadores.c:24:12]\n2000 identifier \"p1\" [examples/ExemploParaTabelaDeIdentificadores.c:24:15]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:24:16]\n2000 identifier \"p1\" [examples/ExemploParaTabelaDeIdentificadores.c:25:11]\n5015 slash_equal \"/=\" [examples/ExemploParaTabelaDeIdentificadores.c:25:14]\n2000 identifier \"num2\" [examples/ExemploParaTabelaDeIdentificadores.c:25:19]\n5009 semicolon \";\" [examples/ExemploParaTabelaDeIdentificadores.c:25:20]\n5001 r_brace \"}\" [examples/ExemploParaTabelaDeIdentificadores.c:26:6]\n5001 r_brace \"}\" [examples/ExemploParaTabelaDeIdentificadores.c:27:2]\n```\n\n### Syntax analysis\n\n```bash\n\u003e jcc sint --help\nUsage: jcc sint [options] \u003cfilepath\u003e\n\nPerform syntactic analysis on the source file\n\nArguments:\n  filepath                   Path to source code file\n\nOptions:\n  -e, --encoding \u003cencoding\u003e  Encoding of source code file (default: \"utf-8\")\n  -h, --help                 display help for command\n```\n\n#### Example\n\nUncomment some errors in the [example file](examples/example.c) and run the syntax analyzer to view the error messages.\n\n```bash\n\u003e npm run sint:example\n0: int []\n0: TYPE_PRIMITIVE []\n0: TYPE []\n0: TYPE identifier []\n0: SINGLE_DECLARATION []\n0: DECLARATION []\n0: DECLARATION equal []\n0: DECLARATION equal number_literal []\n0: DECLARATION equal EXPRESSION []\n0: DECLARATION_ASSIGNMENT []\n...\n0: STATEMENT DECLARATION []\n0: STATEMENT DECLARATION semicolon []\nexamples/example.c:7:7(utf-8): error: conflicting types for 'a'; have 'float'\n7 | float a;\n  |       ^\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadrianbrs%2Fjcc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadrianbrs%2Fjcc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadrianbrs%2Fjcc/lists"}