
从上图可以看出javacc在解析数据流的核心是token manager,它涵盖了词法状态(Lexical States)和词法动作(Lexical Actions)。
词法状态(Lexical States)
JavaCC词法规范被组织成一组词法状态,token manager随时处于这些词法状态之一。 当token manager初始化时,默认是' DEFAULT '状态。在构造令牌管理器对象时,也可以指定初始的词法状态。
如前面的文章所述,javacc有4种不同类型的正则表达式来定义词法规范,这里我们回忆一下:
| Type | Action |
|---|---|
SKIP |
简单地丢弃匹配的字符串(在执行任何词法操作之后). |
MORE |
继续到下一个状态,带上匹配的字符串。这个字符串将是新匹配字符串的前缀。 |
TOKEN |
使用匹配的字符串创建一个令牌,并将其发送给解析器(或任何调用者)。 |
SPECIAL_TOKEN |
创建不参与解析的特殊令牌。 |
而有些时候我们是需要定义多组词法规范的,每套词法规范都包含不同的TOKEN,SIKP....,这个时候我们就需要使用词法状态来帮我们做管理。下面的例子展示了当遇到不同的字符串切换的不同词法状态:
<DEFAULT> MORE : { "a" : S1 }
<S1> MORE :
{
"b"
{ int l = image.length()-1; image.setCharAt(l, image.charAt(l).toUpperCase()); }
^1 ^2
: S2
}
<S2> TOKEN :
{
"cd" { x = image; } : DEFAULT
^3
}
如上所述,token manager在任何时刻都只处于一种状态。此刻,令牌管理器只考虑在此状态下定义的正则表达式进行匹配。 在匹配之后, 可以指定要执行的操作以及要移动到的新词法状态。如果没有指定新的词法状态,令牌管理器将保持当前状态。
所有
JavaCC解析器中的TokenManager:词法状态与动作详解

本文详细解释了JavaCC解析器中TokenManager的工作原理,特别是词法状态管理和词法动作。词法状态控制正则表达式的匹配和状态转移,而词法动作定义匹配后执行的操作,包括处理TOKEN、SPECIAL_TOKEN和流控制。
最低0.47元/天 解锁文章
1122

被折叠的 条评论
为什么被折叠?



