Действие JavaCC в определении токена

#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 и сделаю это таким образом!