WEB开发网
开发学院网页设计JavaScript javascript设计模式交流(2) 阅读

javascript设计模式交流(2)

 2010-09-14 13:17:16 来源:WEB开发网   
核心提示: 这是一个标准的状态机处理词法分析的例子,事实上,javascript设计模式交流(2)(5),有些简单的解释器模式,仅仅通过词法分析即可实现,参数中[fun]的个数应与%f[x]的数目一致fun:可选的,处理函数,功能可以写在状态改变函数中,而无需对产生的token流进行处理

这是一个标准的状态机处理词法分析的例子,事实上,有些简单的解释器模式,仅仅通过词法分析即可实现,功能可以写在状态改变函数中,而无需对产生的token流进行处理。

函数式语言特性与状态机模式

作为函数式语言,js实现解释器模式有非常有趣的方式:以不定个数的参数形式传入函数进行处理,这样可以方便的扩展功能,同时可以使用户更自由的使用解释器提供的接口。

下面一段代码是一个用于日期对象的格式化的类 它是状态机词法分析的一个稍微复杂的例子,同时它以函数参数的方式为用户提供了扩展功能。

/*
DateEx类
说明:以参数形式继承自Date对象为Date对象扩展方法
方法:
  format(formatString,[fun],......)
  参数:
    formatString:格式字符串将日期转换成所规定的格式字符串
      格式说明:
        %[x]:
          [x]代表日期的一个部分
        %y:年
        %m:月
        %d:日
        %w:星期
        %h:小时
        %i:分
        %s:秒
        
        %[num][x]:
          [num]代表长度[x]意义同上如果长度不足则用0补齐如果长度超出[num]则将高位截断
          
        %f[x]:
          以自定义函数处理%[x]得到的值,自定义函数在参数列表[fun]中给出,参数中[fun]的个数应与%f[x]的数目一致
       
    
    fun:可选的,处理函数,当格式字符串中有格式符%f出现时,则在fun中取相应的函数处理
*/
functionDateEx(date){
  date=date||newDate();
  date.format=function(formatString)
  {  
    varf;
    varj=0;    
    functionfbuilder(n){
      returnfunction(v){
        vars=v.toString();
        if(s.length>=n)returns.slice(s.length-n,s.length);
        if(s.length<n)returnnewArray(n-s.length+1).join(0)+s;
      };      
    }
    varargs=arguments;
    varresault=newString();
    var_1=function(c)//状态1是读入格式字符串的状态
    {
      if(c!="%")//对于非%字符按原样输出
      {
        resault+=c;
        return_1;
      }
      else//读到%时进入状态2否则延续状态1
      {
        return_2;
      }
    };
    var_2=function(c)//状态2是读入特殊格式字符串的状态
    {
      if(c.match(/d/)!=null)//对于数字构造相应处理函数返回状态3
      {
        f=fbuilder(Number(c));
        return_3;
      }
      elseif(c=="f")//对于格式符f从参数中获取相应处理函数返回状态3
      {
        f=args[++j];
        return_3;
      }
      else//没有特殊格式符直接进入状态3
      {
        f=function(v){returnv;}
        return_3(c);
      }
      
      
    };
    var_3=function(c)
    {
      if(c=="%")//格式符%连续2个%将被转义为一个%返回状态1
      {
        resault+=c;
        return_1;        
      }
      elseif(c=="y")//格式符y取出年份返回状态1
      {
        resault+=f(date.getFullYear());
        
        return_1;
      }
      elseif(c=="m")//格式符m取出月份返回状态1
      {
        resault+=f(date.getMonth()+1);
        return_1;
      }
      elseif(c=="d")//格式符d取出日期返回状态1
      {
        resault+=f(date.getDate());
        return_1;
      }
      elseif(c=="w")//格式符w取出星期返回状态1
      {
        resault+=f(date.getDay());
        return_1;
      }      
      elseif(c=="h")//格式符h取出小时返回状态1
      {
        resault+=f(date.getHours());
        return_1;
      }
      elseif(c=="i")//格式符i取出分返回状态1
      {
        resault+=f(date.getMinutes());
        return_1;
      }
      elseif(c=="s")//格式符s取出秒返回状态1
      {
        resault+=f(date.getSeconds());
        return_1;
      }
      elsereturn_1//没有合法格式符忽略返回状态1
    };    
    varstatus=_1;
    for(vari=0;i<formatString.length;i++)
    {
      status=status(formatString.charAt(i));
    }
    returnresault;
  }
  returndate;
}
varweekdays="日一二三四五六"
document.write(newDateEx().format("%2y-%2m-%2d星期%fw%2h:%2i:%2s%%",function(v){returnweekdays.charAt(v);}))

上一页  1 2 3 4 5 6  下一页

Tags:javascript 设计模式 交流

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接