Действие JavaCC в определении токена - PullRequest
0 голосов
/ 01 июня 2011

Мне было интересно, можно ли подключиться к лексеру 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 Ответ

3 голосов
/ 01 июня 2011

Нет, вы не можете. Лексер - это конечный автомат.

Что вы можете сделать, это реализовать лексическое действие, которое проверяет символы совпадающей строки и добавляет результат этой проверки к выданному токену (например, путем установки значения настраиваемого поля). Но вы не можете использовать результат проверки для руководства лексером.

Вы должны определить токен ID как перечисление всех возможных символов:

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

Примечание: Если вы не используете экранирование Unicode, не забудьте сообщить JavaCC точную кодировку вашего файла грамматики.

Это утомительно, но так работает лексер.

Альтернативой является принятие любого отдельного символа в качестве идентификатора и проверка его в анализаторе или даже позже:

TOKEN {
    < ID: ~[] >
}

Хотя я не вижу причин для этого.

...