1

我想知道是否可以连接到 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;
}

这是可能吗?

4

1 回答 1

4

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

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

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

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

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

这很乏味,但这就是词法分析器的工作方式。

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

TOKEN {
    < ID: ~[] >
}

不过,我认为没有理由这样做。

于 2011-06-01T16:22:52.313 回答