令牌定义中的JavaCC操作

时间:2011-06-01 09:31:55

标签: java parsing unicode lexer javacc

我想知道是否有可能挂钩到JavaCC的词法分析器来调用函数来检查字符是否有效。

我问的原因是我正在尝试实现类似的东西:

TOKEN {
    <ID: id($char)>
}

其中id()是:

//Check to see if the character is an ID character
boolean id(char currentCharacter) {
    int type = Character.getType(currentCharacter);

    return type == Character.LOWERCASE_LETTER || type == Character.MATH_SYMBOL;
}

这一切都可能吗?

1 个答案:

答案 0 :(得分:3)

不,你不能。词法分析器是一个有限状态机。

您可以做的是实现一个词法操作,该操作验证匹配字符串的字符,并将该验证的结果添加到已发布的令牌中(例如,通过设置自定义字段的值)。但是你不能使用验证的结果来指导词法分析器。

您应该将ID标记定义为所有可能字符的枚举:

TOKEN {
    < ID: [ "a"-"z", "α"-"ω", ... ] > // The enumeration is to be continued
}

注意:如果您不使用Unicode转义,请不要忘记告诉JavaCC您的语法文件的确切编码。

这很乏味但是词法分析器的工作原理。

另一种方法是接受任何单个字符作为标识符,并在解析器中验证它,甚至更晚:

TOKEN {
    < ID: ~[] >
}

但我认为没有理由这样做。