• JavaCC: LOOKAHEAD


    1)LOOKAHEAD的作用:
     用于判断是否进入一个语法分支,语法分支有下面的形式:
     a) branch1 | branch2 | branch3
     b) (branch1)*
     c) (branch1)+
     d) (branch1)? 即 [branch1]
     其中,branchx 代表的一系列终结符、非终结符,以及相关的user action为一个语法分支。
     既然LOOKAHEAD对一个语法分支的进入决定起作用,它不能跨越语法分支。
    对于上面的各种情况,LOOKAHEAD通常写为:
     a) branch1 | LOOKAHEAD(...//for branch2) branch2 | branch3
     b) (LOOKAHEAD(...//for branch1) branch1)*
     c) (LOOKAHEAD(...//for branch1) branch1)+
     d) [LOOKAHEAD(...//for branch1) branch1]
     
    2) 可以设定全局的LOOKAHEAD为k,决定解析器为LL(k)解析器,默认k==1,效率最高
     
    3) 为效率起见,一般使用Local的LOOKAHEAD,即上面的a)-d)。

    4)LOOKAHEAD可以分为词法LOOKAHEAD、语法LOOKAHEAD和语义LOOKAHEAD:
             LOOKAHEAD( amount, //词法LOOKAHEAD
            expansion,  //语法LOOKAHEAD
            { boolean_expression }  //语义LOOKAHEAD
          )
       词法、语法、语义LOOKAHEAD可以任意组合使用,即下面的用法都可行:
       LOOKAHEAD(amount)
       LOOKAHEAD(expansion)
       LOOKAHEAD({boolean_expression})
       LOOKAHEAD(amount, expansion)
       LOOKAHEAD(amount, {boolean_expression})
       LOOKAHEAD(expansion, {boolean_expression})
       LOOKAHEAD(amount, expansion, {boolean_expression})
    i)词法LOOKAHEAD
    ...LOOKAHEAD(token数n) branch...
    表示向前看n个token如果这n个token匹配branch,则选择这个branch。
    ii)语法LOOKAHEAD
    ...LOOKAHEAD([限定token数n,] branch前缀语法g) branch...
    表示在向前看token数n个的范围内,如果这些token符合branch前缀语法g,则选择这个branch。
    如果g省略,则退化为词法LOOKAHEAD,可以理解为g此时默认为branch本身。

    iii)语义LOOKAHEAD
    ...LOOKAHEAD([...]{布尔表达式b})branch...
    表示如果布尔表达式b成立,则选择此branch。
    如果b省略,则退化为词法或语法LOOKAHEAD,可以理解为b此时默认为true。
    amount,expansion不会影响布尔表达式b的计算。
    eg.
    [LOOKAHEAD(<C>, {getToken(2).kind == C})     //getToken(2)得到下面第二个token
       <C>]
    如果一个case既包括语法(词法)LOOKAHEAD又包括语义LOOKAHEAD,则是否选择这个 branch取决于两者的布尔与。
     
    5)关于(LOOKAHEAD(...)branch1)+
    注意,这里的branch1包括一个或多个user action。
    根据(branch1)+的含义,它相当与branch1(branch1)*,其中,第一个branch1是必须匹配的,
    在逻辑上无须经过LOOKAHEAD的判断,因此,下面的等价关系成立:
    (LOOKAHEAD(...)branch1)+    <==>  branch1(LOOKAHEAD(...)branch1)*

    转自:http://blog.sina.com.cn/s/blog_5919b8b10100065d.html
  • 相关阅读:
    Javascript常用代码
    Node.cluster
    swift3.0 hello swift(1)
    vs2013 linq to mysql
    ThinkPHP5作业管理系统中处理学生未交作业与已交作业信息
    ThinkPHP5 Model分层及多对多关联的建立
    ThinkPHP5中Session的使用
    用户登陆模块的后端实现
    使用BootStrapValidator来完成前端输入验证
    空间session失效的解决方法
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468863.html
Copyright © 2020-2023  润新知