From 92c661c746bab28e38dd9f920170820d05e1f5db Mon Sep 17 00:00:00 2001 From: penglei Date: Mon, 24 Mar 2014 08:09:03 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=9B=B4=E6=AD=A3=E9=94=99=E8=AF=AFjison?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E7=94=9F=E6=88=90=E7=9A=84clearsilver.js?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=E8=AE=B0=E6=B3=95=E5=88=86=E6=9E=90?= =?UTF-8?q?include=E6=97=B6=E5=B0=B1=E5=87=BA=E9=94=99=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98;\n2.=E8=87=AA=E5=AE=9A=E4=B9=89=E5=87=BA=E9=94=99?= =?UTF-8?q?=E5=A4=84=E7=90=86=EF=BC=8C=E5=8F=AF=E6=8F=90=E7=A4=BA=E5=87=BA?= =?UTF-8?q?=E9=94=99=E6=96=87=E4=BB=B6=E5=90=8D=EF=BC=8C=E6=9B=B4=E6=96=B9?= =?UTF-8?q?=E4=BE=BF=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interpreter/index.js | 26 +++++++++++++++++++++++++- package.json | 2 +- parse/clearsilver.js | 23 +++++++++++++---------- test/dev/aaa | 1 + test/dev/bbb | 4 ++++ test/dev/test_include.cs | 1 - 6 files changed, 44 insertions(+), 13 deletions(-) diff --git a/interpreter/index.js b/interpreter/index.js index c837e2c..a2ce8ff 100644 --- a/interpreter/index.js +++ b/interpreter/index.js @@ -20,6 +20,19 @@ function insertArray(arr, item){ } arr.push(item); } + +function parseError(str, hash, engine){ + var filepath = this.yy.fileid == 1 ? this.yy.filename : engine._includeParentBase + '/' + this.yy.filename; + str = 'Parse error on line : ' + (hash.line + 1) + ', in file --> ' + filepath + '\n' + this.lexer.showPosition(); + if (hash.expected) { + str += '\nExpecting ' + hash.expected.join(', ') + ', got \'' + hash.token + '\''; + } else {//XXX only lex error go here? + str += '\nUnrecognized text.\n' + } + throw new Error(str); +} + + function Engine(csString){ this.result = ""; this._debugMode = false; @@ -30,6 +43,12 @@ function Engine(csString){ this.csparser = new ClearSilverParser(); this.csparser.yy.filename = this._entryPathname = "[main]"; + this.csparser.yy.parseError = function(){ + var args = Array.prototype.slice.call(arguments); + args.push(self); + parseError.apply(this, args); + }; + this._entryPathIsDefault = true; this._includeParentBase = "$(root)"; @@ -65,6 +84,11 @@ Engine.prototype._lexInclude = function(includeName) { //同一个文件只需要解析一次,语法树只允许读,每个地方不需要重新生成 //TODO 检查循环依赖 var csSubParser = new ClearSilverParser(); + csSubParser.yy.parseError = function(){ + var args = Array.prototype.slice.call(arguments); + args.push(self); + parseError.apply(this, args); + }; csSubParser.lexer.include = function(name){ self._lexInclude(name); }; @@ -130,7 +154,7 @@ Engine.prototype.onRender = function(cb){ Engine.prototype.initEntrySource = function(csString, pathname){ if (pathname !== undefined) { this._entryPathIsDefault = false; - this.csparser.yy.name = this._entryPathname = pathname + " [main]"; + this.csparser.yy.filename = this._entryPathname = pathname + " [main]"; } var fileid = this._saveSource(this._entryPathname, csString); diff --git a/package.json b/package.json index 0b6e4a9..a2789a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jencs", - "version": "0.1.3", + "version": "0.1.8", "description": "clearsilver render engine, with a debugger", "keywords": [ "clearsilver", diff --git a/parse/clearsilver.js b/parse/clearsilver.js index 29e1a27..ebf436e 100644 --- a/parse/clearsilver.js +++ b/parse/clearsilver.js @@ -71,7 +71,7 @@ recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) } */ -var clearsilver = (function(){ + var parser = {trace: function trace() { }, yy: {}, symbols_: {"error":2,"cs":3,"inner_statement_list":4,"EOF":5,"statement":6,"block":7,"single_stmt":8,"if":9,"alt":10,"each":11,"loop":12,"with":13,"escape":14,"macro_def":15,"inner_statement_list_repetition0":16,"T_IF":17,"expr":18,"TAG_END":19,"elif_list":20,"else_single":21,"T_END_IF":22,"T_ELIF_TOKENS":23,"T_ELIF":24,"T_ELSEIF":25,"T_ELSE":26,"T_ALT":27,"T_END_ALT":28,"T_EACH":29,"t_variable_one":30,"=":31,"T_END_EACH":32,"T_WITH":33,"base_variable":34,"T_END_WITH":35,"T_ESCAPE":36,"STRING":37,"escape_end":38,"T_END_ESCAPE":39,"T_LOOP":40,"loop_init_expr":41,",":42,"loop_step":43,"T_END_LOOP":44,"T_DEF":45,"T_MACRO_NAME":46,"(":47,"def_formal_parameters":48,")":49,"T_END_MACRO_DEF":50,"def_formal_parameters_repetition_plus0":51,"more_parameter":52,"single_stmt_syntax":53,"CONTENT":54,"set_stmt":55,"var_stmt":56,"name_stmt":57,"macro_call":58,"include_stmt":59,"cs_debugger":60,"T_SET":61,"T_VAR":62,"T_NAME":63,"T_CALL":64,"parameter_list":65,"T_INCLUDE":66,"T_DEBUGGER":67,"variable":68,"expr_basic":69,"#":70,"const_variable":71,"function_call":72,"!":73,"?":74,"$":75,"T_BOOLEAN_OR":76,"T_BOOLEAN_AND":77,"T_IS_EQUAL":78,"T_IS_NOT_EQUAL":79,"<":80,">":81,"T_IS_SMALLER_OR_EQUAL":82,"T_IS_GREATER_OR_EQUAL":83,"+":84,"-":85,"*":86,"/":87,"%":88,"comma_expr":89,"comma_expr_repetition_plus0":90,"comma_expr_more":91,"t_properties":92,"t_property":93,".":94,"t_label":95,"[":96,"]":97,"PROP_NUMBER":98,"T_VARIABLE":99,"t_math_number":100,"NUMBER":101,"NUMBER_HEX":102,"T_FUN_NAME":103,"parameter_list_repetition_plus0":104,"more_parameter_list":105,"$accept":0,"$end":1}, @@ -1127,19 +1127,22 @@ conditions: {"ST_CS_START":{"rules":[1,2,3],"inclusive":false},"ST_CS":{"rules": */; return lexer; })(); -parser.lexer = lexer; +function Lexer(){} +Lexer.prototype = lexer; + function Parser () { - this.yy = {}; + this.yy = {}; + this.lexer = new Lexer(); } -Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})(); - +Parser.prototype = parser; +var clearsilver = new Parser(); if (typeof require !== 'undefined' && typeof exports !== 'undefined') { -exports.parser = clearsilver; -exports.Parser = clearsilver.Parser; -exports.parse = function () { return clearsilver.parse.apply(clearsilver, arguments); }; +exports.parser = clearsilver;//default parser instance +exports.Parser = Parser;//Parser construct function +exports.parse = function () { + return clearsilver.parse.apply(clearsilver, arguments); +};//simple interface for default parser exports.main = function commonjsMain(args) { if (!args[1]) { console.log('Usage: '+args[0]+' FILE'); diff --git a/test/dev/aaa b/test/dev/aaa index e69de29..b4c7aba 100644 --- a/test/dev/aaa +++ b/test/dev/aaa @@ -0,0 +1 @@ + diff --git a/test/dev/bbb b/test/dev/bbb index e69de29..05c4fec 100644 --- a/test/dev/bbb +++ b/test/dev/bbb @@ -0,0 +1,4 @@ + + + + diff --git a/test/dev/test_include.cs b/test/dev/test_include.cs index 3992a12..671f9aa 100644 --- a/test/dev/test_include.cs +++ b/test/dev/test_include.cs @@ -1,2 +1 @@ -