Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

icmc-forth

This project is a toyish compiler for a toyish language that generates assembly for the ICMC Processor Architecture, the architecture students create and use throughout some courses at ICMC-USP. More Info about the architecture can be found here.

Usage

Build it. (It is an Idea project at the moment and so I believe you need Intellij Idea to build it, but it should generate a pretty jar.)

Pass it a source file, a destination file name and the directories from which to fetch both libif and the #imports used. It should generate an icmc-assembly file that can be assembled using the tools at its github page and run in a simulator (also provided on that page).

If you have an Altera DE2-115 (or DE2-70) you can also generate a core and use that.

In the /testing/ directory you can find some example files used for testing the compiler.

License

All code in this repository (unless explicitly stated otherwise) is provided under the terms of the license available at LICENSE.

The Language

Even though the name of this repository includes the word 'forth', the language implemented isn't really forth, but inspired by forth.

It is a concatenative language that operates on stacks, the data stack and the return stack. All functions and operations happen on these stacks.

The Stacks

There are two stacks.

The data stack is the one most operations take their operands from and push their results to. It is used for data.

The return stack can also hold arbitrary data, but it should be used carefully. The compiler may also use the return stack for instruction pointers used in loops and other control flow operations. This means that a piece of data in the return stack at the wrong time may make the program go haywire.

Literals

Only integers, strings and chars are supported, mostly because the icmc processor only supports 16-bit integers. Integer literals are as expected: any number of digits or hex literals (like 0xFF). String literals are more like C instead of forth: " some string " would include the space after the ", so if you want just the text some string, you'd need the string "some string". Character literals also follow the C model, so the character c would be 'c'.

Comments

The compiler will ignore everything between a \ token and a newline character (\n). It will also ignore everything from a ( token until it finds a ) token. The word "token" is important because it means that comment characters must be separated from the comments. Examples:

( valid comment )\ also a valid comment
(not a valid comment)
\also not valid comment

Function Definitions

Function definitions follow the pattern:

: function-name
( function body ) ;

Since everything shares the same data and return stacks, there is no "returning" from functions, to "return" data from functions just leave it on the stack.

: returns-five
5 ;

Examples // TODO

About

A forth compiler for the ICMC processor architecture.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} 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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

icmc-forth

This project is a toyish compiler for a toyish language that generates assembly for the ICMC Processor Architecture, the architecture students create and use throughout some courses at ICMC-USP. More Info about the architecture can be found here.

Usage

Build it. (It is an Idea project at the moment and so I believe you need Intellij Idea to build it, but it should generate a pretty jar.)

Pass it a source file, a destination file name and the directories from which to fetch both libif and the #imports used. It should generate an icmc-assembly file that can be assembled using the tools at its github page and run in a simulator (also provided on that page).

If you have an Altera DE2-115 (or DE2-70) you can also generate a core and use that.

In the /testing/ directory you can find some example files used for testing the compiler.

License

All code in this repository (unless explicitly stated otherwise) is provided under the terms of the license available at LICENSE.

The Language

Even though the name of this repository includes the word 'forth', the language implemented isn't really forth, but inspired by forth.

It is a concatenative language that operates on stacks, the data stack and the return stack. All functions and operations happen on these stacks.

The Stacks

There are two stacks.

The data stack is the one most operations take their operands from and push their results to. It is used for data.

The return stack can also hold arbitrary data, but it should be used carefully. The compiler may also use the return stack for instruction pointers used in loops and other control flow operations. This means that a piece of data in the return stack at the wrong time may make the program go haywire.

Literals

Only integers, strings and chars are supported, mostly because the icmc processor only supports 16-bit integers. Integer literals are as expected: any number of digits or hex literals (like 0xFF). String literals are more like C instead of forth: " some string " would include the space after the ", so if you want just the text some string, you'd need the string "some string". Character literals also follow the C model, so the character c would be 'c'.

Comments

The compiler will ignore everything between a \ token and a newline character (\n). It will also ignore everything from a ( token until it finds a ) token. The word "token" is important because it means that comment characters must be separated from the comments. Examples:

( valid comment )\ also a valid comment
(not a valid comment)
\also not valid comment

Function Definitions

Function definitions follow the pattern:

: function-name
( function body ) ;

Since everything shares the same data and return stacks, there is no "returning" from functions, to "return" data from functions just leave it on the stack.

: returns-five
5 ;

Examples // TODO

About

A forth compiler for the ICMC processor architecture.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

icmc-forth

This project is a toyish compiler for a toyish language that generates assembly for the ICMC Processor Architecture, the architecture students create and use throughout some courses at ICMC-USP. More Info about the architecture can be found here.

Usage

Build it. (It is an Idea project at the moment and so I believe you need Intellij Idea to build it, but it should generate a pretty jar.)

Pass it a source file, a destination file name and the directories from which to fetch both libif and the #imports used. It should generate an icmc-assembly file that can be assembled using the tools at its github page and run in a simulator (also provided on that page).

If you have an Altera DE2-115 (or DE2-70) you can also generate a core and use that.

In the /testing/ directory you can find some example files used for testing the compiler.

License

All code in this repository (unless explicitly stated otherwise) is provided under the terms of the license available at LICENSE.

The Language

Even though the name of this repository includes the word 'forth', the language implemented isn't really forth, but inspired by forth.

It is a concatenative language that operates on stacks, the data stack and the return stack. All functions and operations happen on these stacks.

The Stacks

There are two stacks.

The data stack is the one most operations take their operands from and push their results to. It is used for data.

The return stack can also hold arbitrary data, but it should be used carefully. The compiler may also use the return stack for instruction pointers used in loops and other control flow operations. This means that a piece of data in the return stack at the wrong time may make the program go haywire.

Literals

Only integers, strings and chars are supported, mostly because the icmc processor only supports 16-bit integers. Integer literals are as expected: any number of digits or hex literals (like 0xFF). String literals are more like C instead of forth: " some string " would include the space after the ", so if you want just the text some string, you'd need the string "some string". Character literals also follow the C model, so the character c would be 'c'.

Comments

The compiler will ignore everything between a \ token and a newline character (\n). It will also ignore everything from a ( token until it finds a ) token. The word "token" is important because it means that comment characters must be separated from the comments. Examples:

( valid comment )\ also a valid comment
(not a valid comment)
\also not valid comment

Function Definitions

Function definitions follow the pattern:

: function-name
( function body ) ;

Since everything shares the same data and return stacks, there is no "returning" from functions, to "return" data from functions just leave it on the stack.

: returns-five
5 ;

Examples // TODO

About

A forth compiler for the ICMC processor architecture.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

icmc-forth

This project is a toyish compiler for a toyish language that generates assembly for the ICMC Processor Architecture, the architecture students create and use throughout some courses at ICMC-USP. More Info about the architecture can be found here.

Usage

Build it. (It is an Idea project at the moment and so I believe you need Intellij Idea to build it, but it should generate a pretty jar.)

Pass it a source file, a destination file name and the directories from which to fetch both libif and the #imports used. It should generate an icmc-assembly file that can be assembled using the tools at its github page and run in a simulator (also provided on that page).

If you have an Altera DE2-115 (or DE2-70) you can also generate a core and use that.

In the /testing/ directory you can find some example files used for testing the compiler.

License

All code in this repository (unless explicitly stated otherwise) is provided under the terms of the license available at LICENSE.

The Language

Even though the name of this repository includes the word 'forth', the language implemented isn't really forth, but inspired by forth.

It is a concatenative language that operates on stacks, the data stack and the return stack. All functions and operations happen on these stacks.

The Stacks

There are two stacks.

The data stack is the one most operations take their operands from and push their results to. It is used for data.

The return stack can also hold arbitrary data, but it should be used carefully. The compiler may also use the return stack for instruction pointers used in loops and other control flow operations. This means that a piece of data in the return stack at the wrong time may make the program go haywire.

Literals

Only integers, strings and chars are supported, mostly because the icmc processor only supports 16-bit integers. Integer literals are as expected: any number of digits or hex literals (like 0xFF). String literals are more like C instead of forth: " some string " would include the space after the ", so if you want just the text some string, you'd need the string "some string". Character literals also follow the C model, so the character c would be 'c'.

Comments

The compiler will ignore everything between a \ token and a newline character (\n). It will also ignore everything from a ( token until it finds a ) token. The word "token" is important because it means that comment characters must be separated from the comments. Examples:

( valid comment )\ also a valid comment
(not a valid comment)
\also not valid comment

Function Definitions

Function definitions follow the pattern:

: function-name
( function body ) ;

Since everything shares the same data and return stacks, there is no "returning" from functions, to "return" data from functions just leave it on the stack.

: returns-five
5 ;

Examples // TODO

About

A forth compiler for the ICMC processor architecture.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } 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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

icmc-forth

This project is a toyish compiler for a toyish language that generates assembly for the ICMC Processor Architecture, the architecture students create and use throughout some courses at ICMC-USP. More Info about the architecture can be found here.

Usage

Build it. (It is an Idea project at the moment and so I believe you need Intellij Idea to build it, but it should generate a pretty jar.)

Pass it a source file, a destination file name and the directories from which to fetch both libif and the #imports used. It should generate an icmc-assembly file that can be assembled using the tools at its github page and run in a simulator (also provided on that page).

If you have an Altera DE2-115 (or DE2-70) you can also generate a core and use that.

In the /testing/ directory you can find some example files used for testing the compiler.

License

All code in this repository (unless explicitly stated otherwise) is provided under the terms of the license available at LICENSE.

The Language

Even though the name of this repository includes the word 'forth', the language implemented isn't really forth, but inspired by forth.

It is a concatenative language that operates on stacks, the data stack and the return stack. All functions and operations happen on these stacks.

The Stacks

There are two stacks.

The data stack is the one most operations take their operands from and push their results to. It is used for data.

The return stack can also hold arbitrary data, but it should be used carefully. The compiler may also use the return stack for instruction pointers used in loops and other control flow operations. This means that a piece of data in the return stack at the wrong time may make the program go haywire.

Literals

Only integers, strings and chars are supported, mostly because the icmc processor only supports 16-bit integers. Integer literals are as expected: any number of digits or hex literals (like 0xFF). String literals are more like C instead of forth: " some string " would include the space after the ", so if you want just the text some string, you'd need the string "some string". Character literals also follow the C model, so the character c would be 'c'.

Comments

The compiler will ignore everything between a \ token and a newline character (\n). It will also ignore everything from a ( token until it finds a ) token. The word "token" is important because it means that comment characters must be separated from the comments. Examples:

( valid comment )\ also a valid comment
(not a valid comment)
\also not valid comment

Function Definitions

Function definitions follow the pattern:

: function-name
( function body ) ;

Since everything shares the same data and return stacks, there is no "returning" from functions, to "return" data from functions just leave it on the stack.

: returns-five
5 ;

Examples // TODO

About

A forth compiler for the ICMC processor architecture.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

icmc-forth

This project is a toyish compiler for a toyish language that generates assembly for the ICMC Processor Architecture, the architecture students create and use throughout some courses at ICMC-USP. More Info about the architecture can be found here.

Usage

Build it. (It is an Idea project at the moment and so I believe you need Intellij Idea to build it, but it should generate a pretty jar.)

Pass it a source file, a destination file name and the directories from which to fetch both libif and the #imports used. It should generate an icmc-assembly file that can be assembled using the tools at its github page and run in a simulator (also provided on that page).

If you have an Altera DE2-115 (or DE2-70) you can also generate a core and use that.

In the /testing/ directory you can find some example files used for testing the compiler.

License

All code in this repository (unless explicitly stated otherwise) is provided under the terms of the license available at LICENSE.

The Language

Even though the name of this repository includes the word 'forth', the language implemented isn't really forth, but inspired by forth.

It is a concatenative language that operates on stacks, the data stack and the return stack. All functions and operations happen on these stacks.

The Stacks

There are two stacks.

The data stack is the one most operations take their operands from and push their results to. It is used for data.

The return stack can also hold arbitrary data, but it should be used carefully. The compiler may also use the return stack for instruction pointers used in loops and other control flow operations. This means that a piece of data in the return stack at the wrong time may make the program go haywire.

Literals

Only integers, strings and chars are supported, mostly because the icmc processor only supports 16-bit integers. Integer literals are as expected: any number of digits or hex literals (like 0xFF). String literals are more like C instead of forth: " some string " would include the space after the ", so if you want just the text some string, you'd need the string "some string". Character literals also follow the C model, so the character c would be 'c'.

Comments

The compiler will ignore everything between a \ token and a newline character (\n). It will also ignore everything from a ( token until it finds a ) token. The word "token" is important because it means that comment characters must be separated from the comments. Examples:

( valid comment )\ also a valid comment
(not a valid comment)
\also not valid comment

Function Definitions

Function definitions follow the pattern:

: function-name
( function body ) ;

Since everything shares the same data and return stacks, there is no "returning" from functions, to "return" data from functions just leave it on the stack.

: returns-five
5 ;

Examples // TODO

About

A forth compiler for the ICMC processor architecture.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

icmc-forth

This project is a toyish compiler for a toyish language that generates assembly for the ICMC Processor Architecture, the architecture students create and use throughout some courses at ICMC-USP. More Info about the architecture can be found here.

Usage

Build it. (It is an Idea project at the moment and so I believe you need Intellij Idea to build it, but it should generate a pretty jar.)

Pass it a source file, a destination file name and the directories from which to fetch both libif and the #imports used. It should generate an icmc-assembly file that can be assembled using the tools at its github page and run in a simulator (also provided on that page).

If you have an Altera DE2-115 (or DE2-70) you can also generate a core and use that.

In the /testing/ directory you can find some example files used for testing the compiler.

License

All code in this repository (unless explicitly stated otherwise) is provided under the terms of the license available at LICENSE.

The Language

Even though the name of this repository includes the word 'forth', the language implemented isn't really forth, but inspired by forth.

It is a concatenative language that operates on stacks, the data stack and the return stack. All functions and operations happen on these stacks.

The Stacks

There are two stacks.

The data stack is the one most operations take their operands from and push their results to. It is used for data.

The return stack can also hold arbitrary data, but it should be used carefully. The compiler may also use the return stack for instruction pointers used in loops and other control flow operations. This means that a piece of data in the return stack at the wrong time may make the program go haywire.

Literals

Only integers, strings and chars are supported, mostly because the icmc processor only supports 16-bit integers. Integer literals are as expected: any number of digits or hex literals (like 0xFF). String literals are more like C instead of forth: " some string " would include the space after the ", so if you want just the text some string, you'd need the string "some string". Character literals also follow the C model, so the character c would be 'c'.

Comments

The compiler will ignore everything between a \ token and a newline character (\n). It will also ignore everything from a ( token until it finds a ) token. The word "token" is important because it means that comment characters must be separated from the comments. Examples:

( valid comment )\ also a valid comment
(not a valid comment)
\also not valid comment

Function Definitions

Function definitions follow the pattern:

: function-name
( function body ) ;

Since everything shares the same data and return stacks, there is no "returning" from functions, to "return" data from functions just leave it on the stack.

: returns-five
5 ;

Examples // TODO

About

A forth compiler for the ICMC processor architecture.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

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

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

icmc-forth

This project is a toyish compiler for a toyish language that generates assembly for the ICMC Processor Architecture, the architecture students create and use throughout some courses at ICMC-USP. More Info about the architecture can be found here.

Usage

Build it. (It is an Idea project at the moment and so I believe you need Intellij Idea to build it, but it should generate a pretty jar.)

Pass it a source file, a destination file name and the directories from which to fetch both libif and the #imports used. It should generate an icmc-assembly file that can be assembled using the tools at its github page and run in a simulator (also provided on that page).

If you have an Altera DE2-115 (or DE2-70) you can also generate a core and use that.

In the /testing/ directory you can find some example files used for testing the compiler.

License

All code in this repository (unless explicitly stated otherwise) is provided under the terms of the license available at LICENSE.

The Language

Even though the name of this repository includes the word 'forth', the language implemented isn't really forth, but inspired by forth.

It is a concatenative language that operates on stacks, the data stack and the return stack. All functions and operations happen on these stacks.

The Stacks

There are two stacks.

The data stack is the one most operations take their operands from and push their results to. It is used for data.

The return stack can also hold arbitrary data, but it should be used carefully. The compiler may also use the return stack for instruction pointers used in loops and other control flow operations. This means that a piece of data in the return stack at the wrong time may make the program go haywire.

Literals

Only integers, strings and chars are supported, mostly because the icmc processor only supports 16-bit integers. Integer literals are as expected: any number of digits or hex literals (like 0xFF). String literals are more like C instead of forth: " some string " would include the space after the ", so if you want just the text some string, you'd need the string "some string". Character literals also follow the C model, so the character c would be 'c'.

Comments

The compiler will ignore everything between a \ token and a newline character (\n). It will also ignore everything from a ( token until it finds a ) token. The word "token" is important because it means that comment characters must be separated from the comments. Examples:

( valid comment )\ also a valid comment
(not a valid comment)
\also not valid comment

Function Definitions

Function definitions follow the pattern:

: function-name
( function body ) ;

Since everything shares the same data and return stacks, there is no "returning" from functions, to "return" data from functions just leave it on the stack.

: returns-five
5 ;

Examples // TODO

About

A forth compiler for the ICMC processor architecture.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages