var oldtop = 2;
var oldleft = 2;
while(1)
{
offsetend.movetopoint(osel.offsetleft, osel.offsettop);
offsetend.movestart("character",-1-rows);
if (offsetend.text.length > 0 || offsetend.offsettop == oldtop && offsetend.offsetleft == oldleft)
{
break;
}
rows ++;
oldtop = offsetend.offsettop;
oldleft = offsetend.offsetleft;
}
return rows;
}
function getcursorposition()
{
var src = event.srcelement;
var offset = src.document.selection.createrange();
var osel = document.selection.createrange();
var textlength = src.innertext.length;
offset.movetopoint(osel.offsetleft, osel.offsettop);
offset.movestart("character", -99999);
//src.document.execcommand("forecolor",false,"#ff0000");
var rowspans = offset.getclientrects();
var pos = getpos(offset.text);
var charcodes = offset.text.length; //字符总数
var chars = offset.text.replace(/\r\n/g,"").length + 1; //字符
var extrows = getnullrows(src,osel);
if(extrows > 0)
{
pos[0] += extrows;
pos[1] = 1;
}
window.status = "行: " + pos[0] +", 列: " + pos[1] + ", 第 " + chars + " 个字符" + " ("+ osel.offsettop +","+
osel.offsetleft +")";
return charcodes;
}
///词法解析过程................................................................................
///............................................................................................
///............................................................................................
var syntaxset = new array(); //词法规则集合
syntaxset.all = new array();
syntaxset.parse = function(token) //针对token返回rule
{
for (var i = 0; i < this.all.length; i++)
{
var syntaxes = this.all[i];
for (var j = 0; j < syntaxes.rules.all.length; j++)
{
if (syntaxes.rules.all[j].test(token))
{
syntaxes.rules.all[j].color = syntaxes.color;
return syntaxes.rules.all[j];
}
}
}
return null;
}
syntaxset.add = function(syntaxes)
{
if(this[syntaxes.name] != null)
return;
this[syntaxes.name] = syntaxes;
this.all.push(syntaxes);
}
function syntaxes(name, color, cons) //词法规则组(同组规则用一种颜色标记)
{
this.name = name; //规则组名称
this.color = color; //标记该语法的颜色
this.rules = new array(); //语法规则(以次序决定优先级)
this.rules.all = new array();
this.cons = cons; //边界约束
syntaxes.prototype.addrule = function(rule)
{
if(this.rules[rule.name] != null)
return;
this.rules[rule.name] = rule;
this.rules.all.push(rule);
}
}
function syntaxrule(name, regexp) //词法规则
{
this.name = name; //规则名称
this.expr = regexp; //规则描述 (正则表达式)
syntaxrule.prototype.test = function(token)
{
return this.expr.test(token);
}
}
function regexprx(exprstr) //扩展正则表达式的功能,支持定义嵌套
{
this.expr = exprstr;
}
regexprx.prototype.getpattern = function(tag) //获取正则表达式对象
{
if (tag == null)
return new regexp(this.expr);
else
return new regexp(this.expr, tag);
}
regexprx.prototype.concat = function(expr, rule) //连接两个正则表达式串
{
if (rule == null)
this.expr += expr; //直接连接
else if (rule == "union") //联合
this.expr = "(" + this.expr + ")" + "|" + "(" + expr + ")";
else if (rule == "cons") //约束
this.expr = this.expr + "(?=" + expr + ")";
return this.expr;
}