Repository files navigation

A simple and modular C-like compiler in C++

1. Source language

This project is a small compiler written in modern C++ for education and practice. The source language it compiles is called C0, which is a modified subset of C for educational purposes. The BNF grammar rules of C0 can be found in the file Grammar. In brief, this tiny language consists of the following components:

  1. Constant declarations, like const int a = 1, f = 2;
  2. Variable declarations, like char b; int c;
  3. Function definitions, like void func() {}
  4. Some C-like statements and expressions.

The test/ folder contains some vivid examples of the C0 language (files with .c0 suffix).

2. Supported backends

2.1 Mips Assembly

We have a hand-rolled stack-based IR generator that emits unoptimized Mips assembly, which can be executed by the Mars simulator. To use this backend, please run:

simplecc --asm input.c0

For more examples of the emitted Mips assembly

2.2 LLVM IR

We also integrate with the LLVM backend to enjoy its capacities of optimization and native codegen. To obtain an LLVM IR file, please run:

simplecc --emit-llvm input.c0

For more examples of emitted IR, please see the *.ll files in test/LLVM/ir/.

To obtain a native executable, please run:

simplecc --emit-llvm | clang -x ir

3. Visualization & debug support

We provide some support to inspect the intermediate results of the compiler.

3.1 Tokens

To see a stream of tokens, please run:

simplecc --print-tokens input.c0

This will print details about the tokens extracted from the source (one token in a line).

3.2 AST

To pretty-print the AST of the program, please run:

simplecc --print-ast input.c0

To obtain a flowchart of the AST, a graphviz-based diagram of AST can be generated with:

simplecc --ast-graph input.c0

This command will generate a dot file, which can be passed to the command dot as follows:

simplecc --ast-graph input.c0 | dot -Tpng -o input.png

3.3 Syntax checking

To check the syntax of a source file (but not emitting anything), please run:

simplecc --check-only input.c0

This will print any detected errors to the console.

4. Build & Install

This project requires a modern compiler that supports C++11. Please run the following commands to build and install our executable:

cd simplecc/ && mkdir -p build/
cd build/ && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME ../src
make && make install

The command simplecc will then be available.

5. Optimization

For simplicity, we do not implement too many optimization passes. Only simple constant folding and dead code elimination are implemented. Please see src/lib/Transform for more details.

6. Citation

If you use our code in your research, we highly recommend your proper citation as follows:

@misc{cong_simplecc_2018,
title = {Simplecc: {A} simple and modular {C}-like compiler in {C}++},
shorttitle = {Simplecc},
url = {https://github.com/cgsdfc/simplecc.git},
abstract = {Simplecc is a small compiler written in modern C++ that compiles an educational C-like language C0. It has a primary backend that emits stack-based unoptimized Mips assembly. It also integrates with an external LLVM backend that enables optimization and native codegen. Internally it uses a generated parser and generated abstract syntax tree with other important components written in an object-oriented style.},
author = {Cong Feng},
year = {2018},
}

About

A simple and modular C-like compiler in C++ for educational purposes.

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

A simple and modular C-like compiler in C++

1. Source language

This project is a small compiler written in modern C++ for education and practice. The source language it compiles is called C0, which is a modified subset of C for educational purposes. The BNF grammar rules of C0 can be found in the file Grammar. In brief, this tiny language consists of the following components:

  1. Constant declarations, like const int a = 1, f = 2;
  2. Variable declarations, like char b; int c;
  3. Function definitions, like void func() {}
  4. Some C-like statements and expressions.

The test/ folder contains some vivid examples of the C0 language (files with .c0 suffix).

2. Supported backends

2.1 Mips Assembly

We have a hand-rolled stack-based IR generator that emits unoptimized Mips assembly, which can be executed by the Mars simulator. To use this backend, please run:

simplecc --asm input.c0

For more examples of the emitted Mips assembly

2.2 LLVM IR

We also integrate with the LLVM backend to enjoy its capacities of optimization and native codegen. To obtain an LLVM IR file, please run:

simplecc --emit-llvm input.c0

For more examples of emitted IR, please see the *.ll files in test/LLVM/ir/.

To obtain a native executable, please run:

simplecc --emit-llvm | clang -x ir

3. Visualization & debug support

We provide some support to inspect the intermediate results of the compiler.

3.1 Tokens

To see a stream of tokens, please run:

simplecc --print-tokens input.c0

This will print details about the tokens extracted from the source (one token in a line).

3.2 AST

To pretty-print the AST of the program, please run:

simplecc --print-ast input.c0

To obtain a flowchart of the AST, a graphviz-based diagram of AST can be generated with:

simplecc --ast-graph input.c0

This command will generate a dot file, which can be passed to the command dot as follows:

simplecc --ast-graph input.c0 | dot -Tpng -o input.png

3.3 Syntax checking

To check the syntax of a source file (but not emitting anything), please run:

simplecc --check-only input.c0

This will print any detected errors to the console.

4. Build & Install

This project requires a modern compiler that supports C++11. Please run the following commands to build and install our executable:

cd simplecc/ && mkdir -p build/
cd build/ && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME ../src
make && make install

The command simplecc will then be available.

5. Optimization

For simplicity, we do not implement too many optimization passes. Only simple constant folding and dead code elimination are implemented. Please see src/lib/Transform for more details.

6. Citation

If you use our code in your research, we highly recommend your proper citation as follows:

@misc{cong_simplecc_2018,
title = {Simplecc: {A} simple and modular {C}-like compiler in {C}++},
shorttitle = {Simplecc},
url = {https://github.com/cgsdfc/simplecc.git},
abstract = {Simplecc is a small compiler written in modern C++ that compiles an educational C-like language C0. It has a primary backend that emits stack-based unoptimized Mips assembly. It also integrates with an external LLVM backend that enables optimization and native codegen. Internally it uses a generated parser and generated abstract syntax tree with other important components written in an object-oriented style.},
author = {Cong Feng},
year = {2018},
}

About

A simple and modular C-like compiler in C++ for educational purposes.

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

A simple and modular C-like compiler in C++

1. Source language

This project is a small compiler written in modern C++ for education and practice. The source language it compiles is called C0, which is a modified subset of C for educational purposes. The BNF grammar rules of C0 can be found in the file Grammar. In brief, this tiny language consists of the following components:

  1. Constant declarations, like const int a = 1, f = 2;
  2. Variable declarations, like char b; int c;
  3. Function definitions, like void func() {}
  4. Some C-like statements and expressions.

The test/ folder contains some vivid examples of the C0 language (files with .c0 suffix).

2. Supported backends

2.1 Mips Assembly

We have a hand-rolled stack-based IR generator that emits unoptimized Mips assembly, which can be executed by the Mars simulator. To use this backend, please run:

simplecc --asm input.c0

For more examples of the emitted Mips assembly

2.2 LLVM IR

We also integrate with the LLVM backend to enjoy its capacities of optimization and native codegen. To obtain an LLVM IR file, please run:

simplecc --emit-llvm input.c0

For more examples of emitted IR, please see the *.ll files in test/LLVM/ir/.

To obtain a native executable, please run:

simplecc --emit-llvm | clang -x ir

3. Visualization & debug support

We provide some support to inspect the intermediate results of the compiler.

3.1 Tokens

To see a stream of tokens, please run:

simplecc --print-tokens input.c0

This will print details about the tokens extracted from the source (one token in a line).

3.2 AST

To pretty-print the AST of the program, please run:

simplecc --print-ast input.c0

To obtain a flowchart of the AST, a graphviz-based diagram of AST can be generated with:

simplecc --ast-graph input.c0

This command will generate a dot file, which can be passed to the command dot as follows:

simplecc --ast-graph input.c0 | dot -Tpng -o input.png

3.3 Syntax checking

To check the syntax of a source file (but not emitting anything), please run:

simplecc --check-only input.c0

This will print any detected errors to the console.

4. Build & Install

This project requires a modern compiler that supports C++11. Please run the following commands to build and install our executable:

cd simplecc/ && mkdir -p build/
cd build/ && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME ../src
make && make install

The command simplecc will then be available.

5. Optimization

For simplicity, we do not implement too many optimization passes. Only simple constant folding and dead code elimination are implemented. Please see src/lib/Transform for more details.

6. Citation

If you use our code in your research, we highly recommend your proper citation as follows:

@misc{cong_simplecc_2018,
title = {Simplecc: {A} simple and modular {C}-like compiler in {C}++},
shorttitle = {Simplecc},
url = {https://github.com/cgsdfc/simplecc.git},
abstract = {Simplecc is a small compiler written in modern C++ that compiles an educational C-like language C0. It has a primary backend that emits stack-based unoptimized Mips assembly. It also integrates with an external LLVM backend that enables optimization and native codegen. Internally it uses a generated parser and generated abstract syntax tree with other important components written in an object-oriented style.},
author = {Cong Feng},
year = {2018},
}

About

A simple and modular C-like compiler in C++ for educational purposes.

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

A simple and modular C-like compiler in C++

1. Source language

This project is a small compiler written in modern C++ for education and practice. The source language it compiles is called C0, which is a modified subset of C for educational purposes. The BNF grammar rules of C0 can be found in the file Grammar. In brief, this tiny language consists of the following components:

  1. Constant declarations, like const int a = 1, f = 2;
  2. Variable declarations, like char b; int c;
  3. Function definitions, like void func() {}
  4. Some C-like statements and expressions.

The test/ folder contains some vivid examples of the C0 language (files with .c0 suffix).

2. Supported backends

2.1 Mips Assembly

We have a hand-rolled stack-based IR generator that emits unoptimized Mips assembly, which can be executed by the Mars simulator. To use this backend, please run:

simplecc --asm input.c0

For more examples of the emitted Mips assembly

2.2 LLVM IR

We also integrate with the LLVM backend to enjoy its capacities of optimization and native codegen. To obtain an LLVM IR file, please run:

simplecc --emit-llvm input.c0

For more examples of emitted IR, please see the *.ll files in test/LLVM/ir/.

To obtain a native executable, please run:

simplecc --emit-llvm | clang -x ir

3. Visualization & debug support

We provide some support to inspect the intermediate results of the compiler.

3.1 Tokens

To see a stream of tokens, please run:

simplecc --print-tokens input.c0

This will print details about the tokens extracted from the source (one token in a line).

3.2 AST

To pretty-print the AST of the program, please run:

simplecc --print-ast input.c0

To obtain a flowchart of the AST, a graphviz-based diagram of AST can be generated with:

simplecc --ast-graph input.c0

This command will generate a dot file, which can be passed to the command dot as follows:

simplecc --ast-graph input.c0 | dot -Tpng -o input.png

3.3 Syntax checking

To check the syntax of a source file (but not emitting anything), please run:

simplecc --check-only input.c0

This will print any detected errors to the console.

4. Build & Install

This project requires a modern compiler that supports C++11. Please run the following commands to build and install our executable:

cd simplecc/ && mkdir -p build/
cd build/ && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME ../src
make && make install

The command simplecc will then be available.

5. Optimization

For simplicity, we do not implement too many optimization passes. Only simple constant folding and dead code elimination are implemented. Please see src/lib/Transform for more details.

6. Citation

If you use our code in your research, we highly recommend your proper citation as follows:

@misc{cong_simplecc_2018,
title = {Simplecc: {A} simple and modular {C}-like compiler in {C}++},
shorttitle = {Simplecc},
url = {https://github.com/cgsdfc/simplecc.git},
abstract = {Simplecc is a small compiler written in modern C++ that compiles an educational C-like language C0. It has a primary backend that emits stack-based unoptimized Mips assembly. It also integrates with an external LLVM backend that enables optimization and native codegen. Internally it uses a generated parser and generated abstract syntax tree with other important components written in an object-oriented style.},
author = {Cong Feng},
year = {2018},
}

About

A simple and modular C-like compiler in C++ for educational purposes.

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

A simple and modular C-like compiler in C++

1. Source language

This project is a small compiler written in modern C++ for education and practice. The source language it compiles is called C0, which is a modified subset of C for educational purposes. The BNF grammar rules of C0 can be found in the file Grammar. In brief, this tiny language consists of the following components:

  1. Constant declarations, like const int a = 1, f = 2;
  2. Variable declarations, like char b; int c;
  3. Function definitions, like void func() {}
  4. Some C-like statements and expressions.

The test/ folder contains some vivid examples of the C0 language (files with .c0 suffix).

2. Supported backends

2.1 Mips Assembly

We have a hand-rolled stack-based IR generator that emits unoptimized Mips assembly, which can be executed by the Mars simulator. To use this backend, please run:

simplecc --asm input.c0

For more examples of the emitted Mips assembly

2.2 LLVM IR

We also integrate with the LLVM backend to enjoy its capacities of optimization and native codegen. To obtain an LLVM IR file, please run:

simplecc --emit-llvm input.c0

For more examples of emitted IR, please see the *.ll files in test/LLVM/ir/.

To obtain a native executable, please run:

simplecc --emit-llvm | clang -x ir

3. Visualization & debug support

We provide some support to inspect the intermediate results of the compiler.

3.1 Tokens

To see a stream of tokens, please run:

simplecc --print-tokens input.c0

This will print details about the tokens extracted from the source (one token in a line).

3.2 AST

To pretty-print the AST of the program, please run:

simplecc --print-ast input.c0

To obtain a flowchart of the AST, a graphviz-based diagram of AST can be generated with:

simplecc --ast-graph input.c0

This command will generate a dot file, which can be passed to the command dot as follows:

simplecc --ast-graph input.c0 | dot -Tpng -o input.png

3.3 Syntax checking

To check the syntax of a source file (but not emitting anything), please run:

simplecc --check-only input.c0

This will print any detected errors to the console.

4. Build & Install

This project requires a modern compiler that supports C++11. Please run the following commands to build and install our executable:

cd simplecc/ && mkdir -p build/
cd build/ && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME ../src
make && make install

The command simplecc will then be available.

5. Optimization

For simplicity, we do not implement too many optimization passes. Only simple constant folding and dead code elimination are implemented. Please see src/lib/Transform for more details.

6. Citation

If you use our code in your research, we highly recommend your proper citation as follows:

@misc{cong_simplecc_2018,
title = {Simplecc: {A} simple and modular {C}-like compiler in {C}++},
shorttitle = {Simplecc},
url = {https://github.com/cgsdfc/simplecc.git},
abstract = {Simplecc is a small compiler written in modern C++ that compiles an educational C-like language C0. It has a primary backend that emits stack-based unoptimized Mips assembly. It also integrates with an external LLVM backend that enables optimization and native codegen. Internally it uses a generated parser and generated abstract syntax tree with other important components written in an object-oriented style.},
author = {Cong Feng},
year = {2018},
}

About

A simple and modular C-like compiler in C++ for educational purposes.

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

A simple and modular C-like compiler in C++

1. Source language

This project is a small compiler written in modern C++ for education and practice. The source language it compiles is called C0, which is a modified subset of C for educational purposes. The BNF grammar rules of C0 can be found in the file Grammar. In brief, this tiny language consists of the following components:

  1. Constant declarations, like const int a = 1, f = 2;
  2. Variable declarations, like char b; int c;
  3. Function definitions, like void func() {}
  4. Some C-like statements and expressions.

The test/ folder contains some vivid examples of the C0 language (files with .c0 suffix).

2. Supported backends

2.1 Mips Assembly

We have a hand-rolled stack-based IR generator that emits unoptimized Mips assembly, which can be executed by the Mars simulator. To use this backend, please run:

simplecc --asm input.c0

For more examples of the emitted Mips assembly

2.2 LLVM IR

We also integrate with the LLVM backend to enjoy its capacities of optimization and native codegen. To obtain an LLVM IR file, please run:

simplecc --emit-llvm input.c0

For more examples of emitted IR, please see the *.ll files in test/LLVM/ir/.

To obtain a native executable, please run:

simplecc --emit-llvm | clang -x ir

3. Visualization & debug support

We provide some support to inspect the intermediate results of the compiler.

3.1 Tokens

To see a stream of tokens, please run:

simplecc --print-tokens input.c0

This will print details about the tokens extracted from the source (one token in a line).

3.2 AST

To pretty-print the AST of the program, please run:

simplecc --print-ast input.c0

To obtain a flowchart of the AST, a graphviz-based diagram of AST can be generated with:

simplecc --ast-graph input.c0

This command will generate a dot file, which can be passed to the command dot as follows:

simplecc --ast-graph input.c0 | dot -Tpng -o input.png

3.3 Syntax checking

To check the syntax of a source file (but not emitting anything), please run:

simplecc --check-only input.c0

This will print any detected errors to the console.

4. Build & Install

This project requires a modern compiler that supports C++11. Please run the following commands to build and install our executable:

cd simplecc/ && mkdir -p build/
cd build/ && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME ../src
make && make install

The command simplecc will then be available.

5. Optimization

For simplicity, we do not implement too many optimization passes. Only simple constant folding and dead code elimination are implemented. Please see src/lib/Transform for more details.

6. Citation

If you use our code in your research, we highly recommend your proper citation as follows:

@misc{cong_simplecc_2018,
title = {Simplecc: {A} simple and modular {C}-like compiler in {C}++},
shorttitle = {Simplecc},
url = {https://github.com/cgsdfc/simplecc.git},
abstract = {Simplecc is a small compiler written in modern C++ that compiles an educational C-like language C0. It has a primary backend that emits stack-based unoptimized Mips assembly. It also integrates with an external LLVM backend that enables optimization and native codegen. Internally it uses a generated parser and generated abstract syntax tree with other important components written in an object-oriented style.},
author = {Cong Feng},
year = {2018},
}

About

A simple and modular C-like compiler in C++ for educational purposes.

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

A simple and modular C-like compiler in C++

1. Source language

This project is a small compiler written in modern C++ for education and practice. The source language it compiles is called C0, which is a modified subset of C for educational purposes. The BNF grammar rules of C0 can be found in the file Grammar. In brief, this tiny language consists of the following components:

  1. Constant declarations, like const int a = 1, f = 2;
  2. Variable declarations, like char b; int c;
  3. Function definitions, like void func() {}
  4. Some C-like statements and expressions.

The test/ folder contains some vivid examples of the C0 language (files with .c0 suffix).

2. Supported backends

2.1 Mips Assembly

We have a hand-rolled stack-based IR generator that emits unoptimized Mips assembly, which can be executed by the Mars simulator. To use this backend, please run:

simplecc --asm input.c0

For more examples of the emitted Mips assembly

2.2 LLVM IR

We also integrate with the LLVM backend to enjoy its capacities of optimization and native codegen. To obtain an LLVM IR file, please run:

simplecc --emit-llvm input.c0

For more examples of emitted IR, please see the *.ll files in test/LLVM/ir/.

To obtain a native executable, please run:

simplecc --emit-llvm | clang -x ir

3. Visualization & debug support

We provide some support to inspect the intermediate results of the compiler.

3.1 Tokens

To see a stream of tokens, please run:

simplecc --print-tokens input.c0

This will print details about the tokens extracted from the source (one token in a line).

3.2 AST

To pretty-print the AST of the program, please run:

simplecc --print-ast input.c0

To obtain a flowchart of the AST, a graphviz-based diagram of AST can be generated with:

simplecc --ast-graph input.c0

This command will generate a dot file, which can be passed to the command dot as follows:

simplecc --ast-graph input.c0 | dot -Tpng -o input.png

3.3 Syntax checking

To check the syntax of a source file (but not emitting anything), please run:

simplecc --check-only input.c0

This will print any detected errors to the console.

4. Build & Install

This project requires a modern compiler that supports C++11. Please run the following commands to build and install our executable:

cd simplecc/ && mkdir -p build/
cd build/ && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME ../src
make && make install

The command simplecc will then be available.

5. Optimization

For simplicity, we do not implement too many optimization passes. Only simple constant folding and dead code elimination are implemented. Please see src/lib/Transform for more details.

6. Citation

If you use our code in your research, we highly recommend your proper citation as follows:

@misc{cong_simplecc_2018,
title = {Simplecc: {A} simple and modular {C}-like compiler in {C}++},
shorttitle = {Simplecc},
url = {https://github.com/cgsdfc/simplecc.git},
abstract = {Simplecc is a small compiler written in modern C++ that compiles an educational C-like language C0. It has a primary backend that emits stack-based unoptimized Mips assembly. It also integrates with an external LLVM backend that enables optimization and native codegen. Internally it uses a generated parser and generated abstract syntax tree with other important components written in an object-oriented style.},
author = {Cong Feng},
year = {2018},
}

About

A simple and modular C-like compiler in C++ for educational purposes.

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

A simple and modular C-like compiler in C++

1. Source language

This project is a small compiler written in modern C++ for education and practice. The source language it compiles is called C0, which is a modified subset of C for educational purposes. The BNF grammar rules of C0 can be found in the file Grammar. In brief, this tiny language consists of the following components:

  1. Constant declarations, like const int a = 1, f = 2;
  2. Variable declarations, like char b; int c;
  3. Function definitions, like void func() {}
  4. Some C-like statements and expressions.

The test/ folder contains some vivid examples of the C0 language (files with .c0 suffix).

2. Supported backends

2.1 Mips Assembly

We have a hand-rolled stack-based IR generator that emits unoptimized Mips assembly, which can be executed by the Mars simulator. To use this backend, please run:

simplecc --asm input.c0

For more examples of the emitted Mips assembly

2.2 LLVM IR

We also integrate with the LLVM backend to enjoy its capacities of optimization and native codegen. To obtain an LLVM IR file, please run:

simplecc --emit-llvm input.c0

For more examples of emitted IR, please see the *.ll files in test/LLVM/ir/.

To obtain a native executable, please run:

simplecc --emit-llvm | clang -x ir

3. Visualization & debug support

We provide some support to inspect the intermediate results of the compiler.

3.1 Tokens

To see a stream of tokens, please run:

simplecc --print-tokens input.c0

This will print details about the tokens extracted from the source (one token in a line).

3.2 AST

To pretty-print the AST of the program, please run:

simplecc --print-ast input.c0

To obtain a flowchart of the AST, a graphviz-based diagram of AST can be generated with:

simplecc --ast-graph input.c0

This command will generate a dot file, which can be passed to the command dot as follows:

simplecc --ast-graph input.c0 | dot -Tpng -o input.png

3.3 Syntax checking

To check the syntax of a source file (but not emitting anything), please run:

simplecc --check-only input.c0

This will print any detected errors to the console.

4. Build & Install

This project requires a modern compiler that supports C++11. Please run the following commands to build and install our executable:

cd simplecc/ && mkdir -p build/
cd build/ && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME ../src
make && make install

The command simplecc will then be available.

5. Optimization

For simplicity, we do not implement too many optimization passes. Only simple constant folding and dead code elimination are implemented. Please see src/lib/Transform for more details.

6. Citation

If you use our code in your research, we highly recommend your proper citation as follows:

@misc{cong_simplecc_2018,
title = {Simplecc: {A} simple and modular {C}-like compiler in {C}++},
shorttitle = {Simplecc},
url = {https://github.com/cgsdfc/simplecc.git},
abstract = {Simplecc is a small compiler written in modern C++ that compiles an educational C-like language C0. It has a primary backend that emits stack-based unoptimized Mips assembly. It also integrates with an external LLVM backend that enables optimization and native codegen. Internally it uses a generated parser and generated abstract syntax tree with other important components written in an object-oriented style.},
author = {Cong Feng},
year = {2018},
}

About

A simple and modular C-like compiler in C++ for educational purposes.

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Contributors

Languages