论坛首页 Java企业应用论坛

一个 EL语法二义性的问题

浏览 2617 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-03   最后修改:2008-11-04
OO
最近一直在琢磨着怎么扩展我的JSEL语法。想去支持静态函数调用。想到JSP EL中的函数定义方法。

JSP中可以给一批函数,定义在一个命名空间中。调用语法如下。

fn:substr('1234',1,1)//返回'3'


但是JSEL中我已经打算支持直接的全局函数调用,比如我可以直接支持JS中的parseInt,isNaN等全局函数。
如此一来,我需要同时支持两种语法。

parseInt()。
myfn:parseInt()。


如此一来,问题出来了:
xxx  ?  fn:method1() + fn:method(2)

如何解释呢?
语义一:
xxx  ?
     fn:
     method1()  +  fn:method(2)

语义二:
xxx  ?
     fn:method1()  +  fn
     :method(2)

都有道理,不知道改如何去做了。

   发表时间:2008-11-08  
虽然不是很懂可以关于EL方面在jsp的规范里涉及很多的,你可以读一下的!
0 请登录后投票
   发表时间:2008-12-25  
兄弟大牛,准备一个人做一门语言啊,佩服一下!

0 请登录后投票
   发表时间:2009-02-04  
显然,冒号的overuse是个问题。

有以下几种解决方法:

A. 不支持 ? : 运算符
—— JSP就是如此

这个三目运算符其实并不是必须的,去掉它可以大大降低parser的难度。你可以支持if else表达式作为替代,例如:
a ? b : c 改为 if(a) b else c

B. 将 : 换成 ::
—— ES4处理namespace就是如此

但是这改变了JSP用户的习惯

C. 优先按照 ? : 的方式解析,如果需要在 ? : 表达式中使用namespace则要求用括号,否则编译不通过或者扔warning。

即:
xxx  ?  fn:method1() + fn:method(2) 

严格模式:编译不通过或者扔运行时异常

宽松模式:
解释为 xxx ? fn : (method1() + fn:method(2))

要在?:中表示fn:method1,则用户必须写作:

xxx ? (fn:method1()) + fn : method(2)

D. 严格限制namespace的格式,符合格式的,优先解释为namespace
a:b做namespace时,“:”左右不能有空格,并且a、b必须只能是标识符。

E. 假如能支持编译时类型推断,则可以放宽a、b的格式。编译器或解释器预先判断a是否为namespace,假如是namespace则总是按照namespace来处理。一般而言,namespace是静态的,所以可以这样处置,如果你要支持运行时namespace,例如:

var my = debug?mock_ns:prod_ns

my:method()

则可以要求这个罕见的特例必须写成:

var my = debug ? mock_ns : prod_ns

即通过空格来区分。


0 请登录后投票
   发表时间:2009-02-04  
以前考虑过B和C两种模式,但是实现起来都挺麻烦的或者决的不够完美,所以干脆暂时就不支持了。

基于JSEL的模版引擎已经发布了:Lite

该模版引擎有如下特征:
1.基于数组结构的中间代码,可以同时运用于JS,Java,和python三种编程环境
2.默认支持一种XML的源代码格式,编程方式类似于EL+JSP Tag
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics