javacc specialToken的绝对偏移量

时间:2016-07-25 21:31:42

标签: java parsing token syntax-highlighting javacc

我需要为每个令牌添加绝对信息,以集成内部语法高亮框架。

我关注过这篇文章: http://ramkulkarni.com/blog/capturing-absolute-offsets-for-javaccjjtree-tokens/

它适用于常规令牌。

评论被捕获为特殊令牌并出于某种原因 CommonTokenAction不适用于那些人。我已经调试了这个问题,并且生成的XXTokenManager

之后错过了对CommonTokenAction的调用
    if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) {
                                matchedToken = jjFillToken(); 
...   

我可以为此设置任何其他标志吗? 否则我可以手动更改文件,但我不喜欢它,因为它是自动生成的。

1 个答案:

答案 0 :(得分:1)

在JavaCC中有三种令牌。解析器看不到跳过的标记,并且不会为它创建Token对象。解析器可以看到常规标记。解析器看不到特殊标记,但为它们创建了Token个对象。常见令牌操作仅适用于常规令牌。

第一个解决方案:通常,如果您正在进行语法突出显示,则不需要解析器,因此没有理由将任何令牌作为特殊令牌。只需进行注释,例如常规令牌,以便将公共令牌操作应用于它们。

第二种解决方案:使所有令牌成为常规或特殊。然后以下内容应该有效。

public void CommonTokenAction(Token t)
{
    int c = getCurrentTokenAbsolutePosition() + t.image.length();
    do {
        t.absoluteEndColumn = c ;
        c -= t.image.length() ;
        t.absoluteBeginColumn = c;
        t = t.specialToken ;
    } while( t != null ) ;
}