Я искал два часа сейчас. И я действительно не знаю, что делать.Строительство лексера с очень многими токенами
Я пытаюсь построить анализатор, который использует лексер, который может соответствовать нескольким тысячам слов. Это слова естественного языка, поэтому их так много.
Я попытался первым простым способом только с 1000 дифферентом матчи за один жетон:
TOKEN :
{
<VIRG: ",">
| <COORD: "et">
| <ADVERBE: "vraiment">
| <DET: "la">
| <ADJECTIF: "bonne">
| <NOM: "pomme"
| "émails"
| "émaux"
| "APL"
| "APLs"
| "Acide"
| "Acides"
| "Inuk"
[...]
После JAVAC компиляции он возвращает, что код слишком велик.
Итак, как я могу управлять тысячами токенов в своем лексере?
Я читал, что более эффективно использовать n токенов для каждого слова, чем использовать один токен для n слов. Но в этом случае у меня будут правила с 1000 + токенами, что не похоже на лучшую идею;
Я мог бы изменить диспетчер токенов или построить его, чтобы он просто соответствовал словам в списке;
Здесь я знаю, что лексер - конечный автомат, и именно поэтому это невозможно, так что все равно использовать другой лексер? ;
Я могу автоматически генерировать огромное регулярное выражение, которое соответствует каждому слову, но это не позволило бы мне обрабатывать слова независимо после этого, и я не уверен, что писать регулярное выражение на 60 строк будет отличная идея;
Может быть, есть способ загрузить токен из файла, это решение довольно близко к решениям 2 и 3;
Возможно, мне нужен другой язык? Я пытаюсь перейти от XLE (который может обрабатывать лексикон из более чем 70 000 токенов) в java, и здесь интересно создать java-файлы!
Так вот, я могу найти способ обработать несколько тысяч токенов с помощью javacc lexer. Было бы здорово, если бы кто-то использовал это и имел идею?
Лучшие
Корантен
Если вы используете JavaCC для создания синтаксического анализатора, вы можете использовать пользовательский лексер (см. Параметр 'USER_TOKEN_MANAGER'), который использует технику реализации, описанную ниже в @rici. Если вам нужен только лексер, JavaCC, скорее всего, не лучший инструмент. –