Skip to content

Commit

Permalink
开发完成debugger
Browse files Browse the repository at this point in the history
  • Loading branch information
penglei committed Dec 21, 2013
2 parents 393f82a + 22625e9 commit d65c205
Show file tree
Hide file tree
Showing 349 changed files with 30,806 additions and 20,240 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
.DS_Store
node_modules
resource/cs
test/dev/resource/cs

# Editor backup files
*.bak
Expand Down
7 changes: 5 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY:parse parse-debug
.PHONY:parse parse-debug test

all:parse

Expand All @@ -8,7 +8,10 @@ parse:

#jison clearsilver.y clearsilver.l -m amd


parse-debug:
@cd parse && \
jison clearsilver.y clearsilver.l --debug true

test:
@cd test/dev && \
jencs test.cs test.hdf --debug-brk=true
21 changes: 8 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,13 @@ clearsilver template engine with debugger

##usage

1.安装依赖
Usage: jencs <path> [data] [options]

npm -g install express
npm -g install socket.io
npm -g install nomnom
path clearsilver template file
data hdf data file

2.使用示例

git clone https://github.com/penglei/jencs
cd jencs
node test.js --enable-debugger

使用chrome浏览器访问下面的地址:

http://127.0.0.1:10080/
Options:
--debug enable debugger [false]
--debug-brk enable debugger and break on first line. [false]
--include the dir of include command <?cs include:... ?> [.]
--ignore-whitespace ignore \r\n\t of clearsilver template file [false]
90 changes: 73 additions & 17 deletions bin/jencs
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,86 @@
var fs = require('fs');
var path = require('path');

var CSInterpreter = require('../interpreter');

var CSInterpreter = require('jencs');
var Engine = CSInterpreter.Engine;
var AST = CSInterpreter.AST;

var dataHdfFile;
var entryCsFile;
//内容\n\r\t过滤器
function ContentWhiteFilter(valueStr, astNode){
return astNode instanceof AST.AST_Content ? valueStr.replace(/[\r\n\t]/g, '') : valueStr;
}

process.argv.forEach(function (val, index, array) {
if (/\.cs$/.test(val)){
entryCsFile = val;
} else if (/\.hdf$/.test(val)){
dataHdfFile = val;
}
});
var opts = require('nomnom')
.script("jencs")
.options({
"path": {
position: 0,
required: true,
list: false,
help: "clearsilver template file"
},
"data": {
position: 1,
required: false,
help: "hdf data file"
},
"debug": {
//flag: true,
default: false,
help: "enable debugger"
},
"debug-brk": {
//flag: true,
default: false,
help: "enable debugger and break on first line."
},
"include":{
default: '.',
help: "the dir of include command <?cs include:... ?>"
},
"ignore-whitespace": {
default: false,
help: "ignore \\r\\n\\t of clearsilver template file"
},
"port": {
default: "10080",
help:"debugger web server listen port"
}
}).parse();

if (opts["debug-brk"]) {
opts["debug"] = true;
opts.debugBreakFirst = true;
}

var mainCsSource = fs.readFileSync(opts.path, "utf8");
var csIncludeRoot = path.resolve(opts.include || ".");

if (opts.data){
var dataSource = fs.readFileSync(path.resolve(opts.data), "utf8");
} else {
var dataSource = "";
}

var mainCsSource = fs.readFileSync(entryCsFile, "utf8");
var dataSource = fs.readFileSync(dataHdfFile, "utf8");
var csEngine = new Engine();

var TestCSEngine = new Engine();
//必须先设置inlcude的回调,否者分析源码时会找不到包含的文件
csEngine.setLexerInclude(function(filename){
return fs.readFileSync(path.resolve(csIncludeRoot, filename), "utf8");
});

if (opts["ignore-whitespace"]) csEngine.addOutputFilter(ContentWhiteFilter);

csEngine.setConfig({
"debug": opts.debug,
"port":opts.port,
"debugBreakFirst": opts.debugBreakFirst,
"includeBase": csIncludeRoot//包含文件的起始路径。暂时只给调试器使用这个选项
});

TestCSEngine.initEntrySource(mainCsSource);
TestCSEngine.setEndListener(function(){
csEngine.setEndListener(function(result){
process.stdout.write(this.result);
});

TestCSEngine.run(dataSource);
csEngine.initEntrySource(mainCsSource, opts.path);
csEngine.run(dataSource);
5 changes: 4 additions & 1 deletion interpreter/block.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ def_execute(ast.AST_If, function(context){
if (testExpr.isTrue()){
this.gen_body(context);
} else if (this.alternate) {
//在else处暂停一下
this.executer.command(this.alternate.execute, this.alternate);
//this.alternate.execute(context);
}
Expand Down Expand Up @@ -172,8 +173,10 @@ def_execute(ast.AST_Loop, function(context){
});


ast.AST_MacroDef.proto("execJump", function(context, _symbolAlias) {
ast.AST_MacroDef.proto("execJump", function(context, _symbolAlias, caller) {
var scope = context.enterScope(this);
context.currentMacro = this;
scope.caller = caller;

//初始化实参
for (var name in _symbolAlias){
Expand Down
7 changes: 4 additions & 3 deletions interpreter/block_.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,9 @@ def_execute(ast.AST_Loop, function(context){
context.leaveScope();
});

ast.AST_MacroDef.proto("execJump", function(context, _symbolAlias) {
ast.AST_MacroDef.proto("execJump", function(context, _symbolAlias, caller) {
var scope = context.enterScope(this);
scope.caller = caller;

//初始化实参
for(var name in _symbolAlias){
Expand All @@ -172,10 +173,10 @@ def_execute(ast.AST_Escape, function(context){


def_execute(ast.AST_Program, function(context){
context.enterScope(this);
//context.enterScope(this);

this.gen_body(context);

context.leaveScope();
//context.leaveScope();
this.executer.emit("end");
});
22 changes: 19 additions & 3 deletions interpreter/debugger/client/Backend.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ define(function(require){
var EventEmitter = require("events").EventEmitter;

function Backend(conn){

this._conn = conn;
this._connected = false;

this._requests = {};
this._requests._count = 0;
this.replyArgs = { };

conn.on('message', this._dispatchHandler.bind(this));
conn.on('connect', this._connectedHandler.bind(this));
Expand All @@ -23,12 +25,17 @@ define(function(require){
}
Backend.prototype.sendMessage = function(message){
if (!this._connected) return false;
var request = this._requests[message.id];
if (request.callback && message.method && this.replyArgs[message.method]){
request.replyArg = this.replyArgs[message.method];
}
var payload = typeof message == 'string' ? message : JSON.stringify(message);
this._conn.send(payload);
};

Backend.prototype._connectedHandler = function(){
this._connected = true;
this.dispatchEventToListeners("connected");
console.log("debugger connected >>>");
};

Expand All @@ -54,12 +61,21 @@ define(function(require){
Backend.prototype._dispatchHandler = function(message){
var messageObject = (typeof message === "string") ? JSON.parse(message) : message;
if ("id" in messageObject){//confirm request
console.log(messageObject);
//console.log(message);
var request = this._requests[messageObject.id];
delete this._requests[messageObject.id];
this._requests._count--;
if (request.callback){
request.callback.call(request.that);
if (messageObject.error){
} else {
if (request.callback){
var argumentsArray = [ null ];
var paramNames = request.replyArg;
if (paramNames && messageObject.result){
for(var i = 0; i < paramNames.length; i++)
argumentsArray.push(messageObject.result[paramNames[i]]);
}
request.callback.apply(request.that, argumentsArray);
}
}
} else {
var methodName = messageObject.method;
Expand Down
Loading

0 comments on commit d65c205

Please sign in to comment.