JavaCC: LOOKAHEAD
来源:互联网 发布:python 逻辑回归 编辑:程序博客网 时间:2024/05/16 14:33
1)LOOKAHEAD的作用:
用于判断是否进入一个语法分支,语法分支有下面的形式:
a) branch1 | branch2 | branch3
b) (branch1)*
c) (branch1)+
d) (branch1)? 即 [branch1]
其中,branchx代表的一系列终结符、非终结符,以及相关的useraction为一个语法分支。
既然LOOKAHEAD对一个语法分支的进入决定起作用,它不能跨越语法分支。
对于上面的各种情况,LOOKAHEAD通常写为:
a) branch1 | LOOKAHEAD(...//for branch2) branch2| branch3
b) (LOOKAHEAD(...//for branch1) branch1)*
c) (LOOKAHEAD(...//for branch1) branch1)+
d) [LOOKAHEAD(...//for branch1)branch1]
用于判断是否进入一个语法分支,语法分支有下面的形式:
a) branch1 | branch2 | branch3
b) (branch1)*
c) (branch1)+
d) (branch1)? 即 [branch1]
其中,branchx代表的一系列终结符、非终结符,以及相关的useraction为一个语法分支。
既然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。
...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本身。
...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)*
注意,这里的branch1包括一个或多个user action。
根据(branch1)+的含义,它相当与branch1(branch1)*,其中,第一个branch1是必须匹配的,
在逻辑上无须经过LOOKAHEAD的判断,因此,下面的等价关系成立:
(LOOKAHEAD(...)branch1)+ <==> branch1(LOOKAHEAD(...)branch1)*
转自:http://blog.sina.com.cn/s/blog_5919b8b10100065d.html
- JavaCC: LOOKAHEAD
- javacc lookahead 全面解析
- javacc-LOOKAHEAD MiniTutorial 翻译
- JavaCC LOOKAHEAD option
- javacc 中Non-LL(1) 文法处理技巧之LOOKAHEAD
- javaCC
- javacc
- javaCC
- JavaCC
- JavaCC
- javacc ()? ()* ()+
- JavaCC
- X264 - lookahead
- java lookahead的应用
- javacc-3.2
- javacc-3.2
- JavaCC 简介
- javacc简介
- NetBeans 时事通讯(刊号 # 105 - Jun 10, 2010)
- JSTL fmt:formatNumber 数字、货币格式化
- 为理想奋斗
- JSTL标签手册
- #pragma pack 内存对齐
- JavaCC: LOOKAHEAD
- vs2008安装boost库
- Ubuntu 面板消失解决办法
- 使用输出参数返回值:在存储过程中使用参数
- public,private,protected
- #pragma 预处理指令详解
- 将dll注册到GAC的简单图解教程
- 【转载】刷百度空间访问量、极速提升访问数、有图、有软件、下载
- 编译Linux内核