#java #parsing #unicode #lexer #javacc
#java #синтаксический анализ #Юникод #лексер #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:
Нет, вы не можете. Лексер является конечным автоматом.
Что вы можете сделать, так это реализовать лексическое действие, которое проверяет символы соответствующей строки и добавляет результат этой проверки к выданному токену (например, путем установки значения пользовательского поля). Но вы не можете использовать результат проверки для управления лексером.
Вы должны определить ID
токен как перечисление всех возможных символов:
TOKEN {
< ID: [ "a"-"z", "α"-"ω", ... ] > // The enumeration is to be continued
}
Примечание: Если вы не используете экранирование в Юникоде, не забудьте сообщить JavaCC точную кодировку вашего грамматического файла.
Это утомительно, но именно так работает лексер.
Альтернативой является принятие любого отдельного символа в качестве идентификатора и проверка его в анализаторе или даже позже:
TOKEN {
< ID: ~[] >
}
Однако я не вижу причин для этого.
Комментарии:
1. Я так и думал, но надеялся, что нет! Спасибо, что вернулись, я настрою несколько фрагментов группы Unicode и сделаю это таким образом!