You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ChocoPy/web/index.html

178 lines
6.2 KiB

<!DOCTYPE html>
<html>
<head>
<title>ChocoPy Web IDE</title>
<link rel="stylesheet" href="css/normalize.css" />
<link rel="stylesheet" href="css/sakura.css" />
<script
src="js/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
<script src="js/ace.js" type="text/javascript" charset="utf-8"></script>
<style>
.example {
border: 1px solid black;
width: 50em;
height: 20em;
}
.compile-error-marker {
position: absolute;
background-color: rgba(255, 200, 200, 0.3);
}
.compile-button {
float: right;
}
</style>
</head>
<body>
<h1>Compile Me!</h1>
<select id="p1">
<option value="s">My Parser</option>
<option value="r" selected>Reference Parser</option>
</select>
<button id='parseButton' class='compile-button'>Parse Syntax</button>
<br />
<select id="p2">
<option value="s">My Semantic Analysis</option>
<option value="r" selected>Reference Semantic Analysis</option>
</select>
<button id='staticCheckButton' class='compile-button'>Run Static Checks</button>
<br />
<select id="p3">
<option value="s">My Code Generator</option>
<option value="r" selected>Reference Code Generator</option>
</select>
<button id='compileButton' class='compile-button'>Compile to RISC-V</button>
<pre class="example"></pre>
<script>
var compileService = "/compile";
var Range = require('ace/range').Range;
function makeEditor(example) {
var parseButton = $("#parseButton");
var staticCheckButton = $("#staticCheckButton");
var compileButton = $("#compileButton");
var editor = ace.edit(example, {
theme: "ace/theme/github",
mode: "ace/mode/python",
fontSize: "1em"
});
var errorMarkers = []
function clearMarkers() {
editor.session.clearAnnotations();
for (var marker of errorMarkers) {
editor.session.removeMarker(marker);
}
errorMarkers.length = 0;
}
editor.on('change', () => {
clearMarkers();
});
$(".compile-button").click((e) => {
var button = e.target.id;
console.assert(button == 'parseButton' ||
button == 'staticCheckButton' ||
button == 'compileButton');
var parse = true; // always run stage 1
var check = button != 'parseButton'; // run unless only stage 1 requested
var codegen = button == 'compileButton'; // run only when stage 3 requested
clearMarkers();
var code = editor.getValue();
var p1 = parse ? $("#p1").val() : "";
var p2 = check ? $("#p2").val() : "";
var p3 = codegen ? $("#p3").val() : "";
if (codegen) {
var resultWindow = window.open('venus.html?v=0.2.4' , '_blank');
if (resultWindow == null) {
console.error("Could not open new window...");
return; // Cannot show result
}
resultWindow.onload = () => resultWindow.codeMirror.setValue("# Compiling... Please be patient. This can take a few seconds.\n" +
"# (The first compilation takes the longest)");
}
$.ajax({
url: compileService,
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify({input: code, passes:p1+p2+p3}),
success: function(result) {
if (result.asm) {
var asm = result.asm;
console.log(resultWindow.codeMirror);
resultWindow.codeMirror.setValue("# Compiled ChocoPy Program to RISC-V assembly\n" +
"# Execute (run or step-through) using the 'Simulator' tab above \n" +
"# Output will appear on the bottom-left of the simulator\n" + asm);
} else if (result.errors && result.errors.errors && result.errors.errors.length > 0) {
if (codegen) { resultWindow.close(); }
var annotations = []
for (var error of result.errors.errors) {
var loc = error.location;
var msg = error.message;
var startLine = loc[0] - 1;
var startCol = loc[1] - 1;
var endLine = loc[2] - 1;
var endCol = loc[3] - 1;
var range = new Range(startLine, startCol, endLine, endCol+1);
errorMarkers.push(editor.session.addMarker(range, "compile-error-marker", "text", true));
annotations.push({
row: Math.min(Math.max(0, startLine), editor.session.getLength()-1),
text: msg,
type: "error"
});
}
editor.session.setAnnotations(annotations);
} else if (!codegen && result.kind && result.kind == "Program") {
if (check) {
alert("This program is semantically valid!");
} else {
alert("This program parses!");
}
} else {
alert("Unknown error: Should not reach here :-\\");
}
},
error: (xhr) => {
var w = window;
if (resultWindow) { w = resultWindow; }
w.alert("Request to compile service failed :-(\n\n" +
(xhr.responseText || "Unknown error"));
if (resultWindow) { resultWindow.close(); }
}
});
});
}
$(".example").each((i, e) => makeEditor(e))
</script>
</body>
</html>