我需要向每个标记添加绝对信息以集成内部语法突出显示框架。
我关注了这篇文章: http://ramkulkarni.com/blog/capturing-absolute-offsets-for-javaccjjtree-tokens/
对于常规 token 来说它可以正常工作。
由于某种原因,评论被捕获为特殊标记
CommonTokenAction
不适用于这些。我已调试了该问题,并且生成的 XXTokenManager 在
CommonTokenAction
的调用
if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) {
matchedToken = jjFillToken();
...
我可以设置任何其他标志来使其工作吗? 否则我可以手动更改文件,但我不喜欢它,因为它是自动生成的。
最佳答案
在 JavaCC 中,存在三种 token 。跳过的标记对解析器不可见,并且不会为其创建 Token 对象。常规标记对解析器是可见的。特殊标记对于解析器来说是不可见的,但是 Token
对象是为它们创建的。常见 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 ) ;
}
关于javaccspecialToken 的绝对偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38577774/