Skip to content

Commit

Permalink
fix several bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
wintercn committed Apr 29, 2012
1 parent f9c46c4 commit 530fb4b
Show file tree
Hide file tree
Showing 9 changed files with 312 additions and 771 deletions.
142 changes: 142 additions & 0 deletions samples/Beautifier.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
<script src="../source/LexicalParser.js"></script>
<script src="../source/SyntaticalParser.js"></script>
<script src="../source/Parser.js"></script>
<style>
.Keyword, .NullLiteral, .BooleanLiteral {
color:blue;
}
.StringLiteral {
color:red;
}
.RegularExpressionLiteral {
color:red;
}
.NumericLiteral {
color:purple;
}
{
color:purple;
}
</style>

<pre id="output"></pre>
<textarea id="code" style="width:100%;height:500px;">var bubbleSort = function (array) {
for (var x = 0; x < array.length; x++) {
for (var y = 0; y < array.length - x; y++) {
if (array[y] > array[y + 1]) {
swap(array, y, y + 1);
}
}
}
}</textarea>
<button >parse</button>
<script>
var configs = {
indentStyle:"Microsoft"
};

function getClassName(token) {
var classNames = ["InputElement","Comments","SingleLineComments","MultiLineComments","WhiteSpace","Token","IdentifierName","Identifier","Keyword","NullLiteral","BooleanLiteral","Punctuator","NumericLiteral","StringLiteral","RegularExpressionLiteral","LineTerminator"];
return classNames.filter(function(e){ return token.hasOwnProperty(e); }).join(" ");
}

document.querySelector("button").onclick = function(){
var parser = new Parser();
var tree = parser.parse(document.querySelector("#code").value);

var str = "";
var output = document.querySelector("#output");
output.innerHTML = "";
var indent = 0;
var last = null;
var table = {"|=":true,"^=":true,"&=":true,">>>=":true,">>=":true,"<<=":true,"-=":true,"+=":true,"%=":true,"/=":true,"*=":true,"=":true,"?":true,"||":true,"&&":true,"|":true,"^":true,"&":true,"!==":true,"===":true,"!=":true,"==":true,">=":true,"<=":true,">":true,"<":true,">>>":true,">>":true,"<<":true,"-":true,"+":true,"%":true,"*":true,"/":true}

function visitObj(obj) {
visit(obj.childNodes[obj.childNodes.length-1]);
if(obj.childNodes.length>=3)
{
var list = obj.childNodes[obj.childNodes.length-2];
while(list.name == "PropertyNameAndValueList" && list.childNodes.length>2) {
output.appendChild(document.createElement("br"));
var indentSpan = document.createElement("span");
indentSpan.innerHTML = Array(indent+1).join(" ");
output.appendChild(indentSpan);
visit(list.childNodes[0]);
visit(list.childNodes[1]);
list = list.childNodes[list.childNodes.length-1];
}
visit(list);
}
output.appendChild(document.createElement("br"));
var indentSpan = document.createElement("span");
indentSpan.innerHTML = Array(indent+1).join(" ");
output.appendChild(indentSpan);
visit(obj.childNodes[0]);
}


function visit(tree) {
var haveIndent;

if(tree.name=="ObjectLiteral") {
return visitObj(tree);
}

if( last!="return" && (tree.name == "Statement" ||tree.name == "FunctionDeclaration" ||tree.name == "FunctionExpression") && tree.childNodes[0].name!="Block") {
output.appendChild(document.createElement("br"));
var indentSpan = document.createElement("span");
indentSpan.innerHTML = Array(indent+1).join(" ");
output.appendChild(indentSpan);
indent+=4;
last = null;
haveIndent = true;
}

if(tree.token) {
if( last ){
if((tree.token.Identifier || tree.token.Keyword|| tree.token.NumericLiteral|| tree.token.StringLiteral|| tree.token.NullLiteral|| tree.token.BooleanLiteral|| tree.token.RegularExpressionLiteral) && (last.Identifier || last.Keyword|| last.NumericLiteral|| last.StringLiteral|| last.NullLiteral|| last.BooleanLiteral|| last.RegularExpressionLiteral)) output.appendChild(document.createTextNode(" "));;
if(tree.token.NumericLiteral && last.name == "." || last.name == "." && tree.token.NumericLiteral) output.appendChild(document.createTextNode(" "));
}
if(tree.token == "}") {
output.appendChild(document.createElement("br"));
var indentSpan = document.createElement("span");
indentSpan.innerHTML = Array(indent+1-4).join(" ");
output.appendChild(indentSpan);
}
if(tree.token == "else") {
output.appendChild(document.createElement("br"));
var indentSpan = document.createElement("span");
indentSpan.innerHTML = Array(indent+1-4).join(" ");
output.appendChild(indentSpan);
}
if(tree.token == "{") {
output.appendChild(document.createElement("br"));
var indentSpan = document.createElement("span");
indentSpan.innerHTML = Array(indent+1-4).join(" ");
output.appendChild(indentSpan);
}

if(table[tree.token]) output.appendChild(document.createTextNode(" "));
var token = document.createElement("span");
token.className = getClassName(tree.token);
token.appendChild(document.createTextNode(tree.token));
output.appendChild(token);
if(tree.token==",") output.appendChild(document.createTextNode(" "));
if(table[tree.token]) output.appendChild(document.createTextNode(" "));
last = tree.token;
}
else {
var i = tree.childNodes.length;
while(i--) {
visit(tree.childNodes[i]);
}
}
if( haveIndent ) {
indent-=4;
}
}
visit(tree);

}

</script>
85 changes: 85 additions & 0 deletions samples/Compressor.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
<script src="../source/LexicalParser.js"></script>
<script src="../source/SyntaticalParser.js"></script>
<script src="../source/Parser.js"></script>
<style>
.Keyword, .NullLiteral, .BooleanLiteral {
color:blue;
}
.StringLiteral {
color:red;
}
.RegularExpressionLiteral {
color:red;
}
.NumericLiteral {
color:purple;
}
#output {
white-space:pre-wrap;
}
</style>

<pre id="output"></pre>
<textarea id="code" style="width:100%;height:500px;">var bubbleSort = function (array) {
for (var x = 0; x < array.length; x++) {
for (var y = 0; y < array.length - x; y++) {
if (array[y] > array[y + 1]) {
swap(array, y, y + 1);
}
}
}
}</textarea>
<button >parse</button>
<script>

function getClassName(token) {
var classNames = ["InputElement","Comments","SingleLineComments","MultiLineComments","WhiteSpace","Token","IdentifierName","Identifier","Keyword","NullLiteral","BooleanLiteral","Punctuator","NumericLiteral","StringLiteral","RegularExpressionLiteral","LineTerminator"];
return classNames.filter(function(e){ return token.hasOwnProperty(e); }).join(" ");
}

document.querySelector("button").onclick = function(){
var parser = new Parser();
var tree = parser.parse(document.querySelector("#code").value);

var str = "";
var output = document.querySelector("#output");
output.innerHTML = "";
var indent = 0;
var last = null;

function visit(tree) {
var haveIndent;

if( last!="return" && (tree.name == "Statement" ||tree.name == "FunctionDeclaration" ||tree.name == "FunctionExpression") && tree.childNodes[0].name!="Block") {
indent+=4;
last = null;
haveIndent = true;
}

if(tree.token) {
if( last ){
if((tree.token.Identifier || tree.token.Keyword|| tree.token.NumericLiteral|| tree.token.StringLiteral|| tree.token.NullLiteral|| tree.token.BooleanLiteral|| tree.token.RegularExpressionLiteral) && (last.Identifier || last.Keyword|| last.NumericLiteral|| last.StringLiteral|| last.NullLiteral|| last.BooleanLiteral|| last.RegularExpressionLiteral)) output.appendChild(document.createTextNode(" "));;
if(tree.token.NumericLiteral && last.name == "." || last.name == "." && tree.token.NumericLiteral) output.appendChild(document.createTextNode(" "));
}

var token = document.createElement("span");
token.className = getClassName(tree.token);
token.appendChild(document.createTextNode(tree.token));
output.appendChild(token);
last = tree.token;
}
else {
var i = tree.childNodes.length;
while(i--) {
visit(tree.childNodes[i]);
}
}
if( haveIndent ) {
indent-=4;
}
}
visit(tree);

}

</script>
55 changes: 55 additions & 0 deletions samples/Highlighter.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<script src="../source/LexicalParser.js"></script>
<script src="../source/SyntaticalParser.js"></script>
<script src="../source/Parser.js"></script>
<style>
.Keyword, .NullLiteral, .BooleanLiteral {
color:blue;
}
.StringLiteral {
color:red;
}
.RegularExpressionLiteral {
color:red;
}
.NumericLiteral {
color:purple;
}
#output {
white-space:pre-wrap;
}
</style>

<pre id="output"></pre>
<textarea id="code" style="width:100%;height:500px;">var bubbleSort = function (array) {
for (var x = 0; x < array.length; x++) {
for (var y = 0; y < array.length - x; y++) {
if (array[y] > array[y + 1]) {
swap(array, y, y + 1);
}
}
}
}</textarea>
<button >parse</button>
<script>

function getClassName(token) {
var classNames = ["InputElement","Comments","SingleLineComments","MultiLineComments","WhiteSpace","Token","IdentifierName","Identifier","Keyword","NullLiteral","BooleanLiteral","Punctuator","NumericLiteral","StringLiteral","RegularExpressionLiteral","LineTerminator"];
return classNames.filter(function(e){ return token.hasOwnProperty(e); }).join(" ");
}

document.querySelector("button").onclick = function(){
var parser = new Parser();

var str = "";
var output = document.querySelector("#output");
output.innerHTML = "";


var tree = parser.parse(document.querySelector("#code").value,function(token){
var tokenSpan = document.createElement("span");
tokenSpan.className = getClassName(token);
tokenSpan.appendChild(document.createTextNode(token));
output.appendChild(tokenSpan);
});
};
</script>
16 changes: 11 additions & 5 deletions tools/Visualizer.html → samples/Visualizer.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
padding-left:30px;
}
</style>
<script src="../source/parser.js"></script>
<script src="../source/LexicalParser.js"></script>
<script src="../source/SyntaticalParser.js"></script>
<script src="../source/Parser.js"></script>
<script>

var special = {
Expand Down Expand Up @@ -62,10 +64,14 @@
window.onload = function(){

document.querySelector("button").onclick = function(){
var parser = new Parser();
visualizer.innerHTML = "";
var tree = parser.parse(document.querySelector("#code").value);
visualize(document.querySelector("#visualizer"),tree);
try {
var parser = new Parser();
visualizer.innerHTML = "";
var tree = parser.parse(document.querySelector("#code").value);
visualize(document.querySelector("#visualizer"),tree);
} catch(e) {
visualizer.innerHTML = "<span style=\"color:red;\">"+e+"</span>"
}
}
}
</script>
Expand Down
19 changes: 1 addition & 18 deletions source/Parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,7 @@
{
Object.defineProperty(terminalSymbolIndex, e, {});
});
function Symbol(symbolName, token)
{
this.name = symbolName;
this.token = token;
this.childNodes = [];
this. toString =
function(indent)
{
if(!indent)
indent = "";
if(this.childNodes.length == 1)
return this.childNodes[0]. toString (indent);
var str = indent + this.name + (this.token != undefined && this.name != this.token ? ":" + this.token:"") + "\n";
for(var i = 0;i < this.childNodes.length;i++)
str += this.childNodes[i]. toString (indent + " ");
return str;
};
}

this.parse =
function(source, onInputElement)
{
Expand Down
18 changes: 18 additions & 0 deletions source/SyntaticalParser.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,24 @@
"SourceElements":[["SourceElement"], ["SourceElements", "SourceElement"]], "SourceElement":[["Statement"], ["FunctionDeclaration"]]

};
function Symbol(symbolName, token)
{
this.name = symbolName;
this.token = token;
this.childNodes = [];
this. toString =
function(indent)
{
if(!indent)
indent = "";
if(this.childNodes.length == 1)
return this.childNodes[0]. toString (indent);
var str = indent + this.name + (this.token != undefined && this.name != this.token ? ":" + this.token:"") + "\n";
for(var i = 0;i < this.childNodes.length;i++)
str += this.childNodes[i]. toString (indent + " ");
return str;
};
}
function SyntacticalParser()
{
var currentRule;
Expand Down
Loading

0 comments on commit 530fb4b

Please sign in to comment.