2016-11-16 14 views
2

Я искал два часа сейчас. И я действительно не знаю, что делать.Строительство лексера с очень многими токенами

Я пытаюсь построить анализатор, который использует лексер, который может соответствовать нескольким тысячам слов. Это слова естественного языка, поэтому их так много.

Я попытался первым простым способом только с 1000 дифферентом матчи за один жетон:

TOKEN : 
{ 
    <VIRG: ","> 
| <COORD: "et"> 
| <ADVERBE: "vraiment"> 
| <DET: "la"> 
| <ADJECTIF: "bonne"> 
| <NOM: "pomme" 
     | "émails" 
     | "émaux" 
     | "APL" 
     | "APLs" 
     | "Acide" 
     | "Acides" 
     | "Inuk" 

[...] 

После JAVAC компиляции он возвращает, что код слишком велик.

Итак, как я могу управлять тысячами токенов в своем лексере?

  1. Я читал, что более эффективно использовать n токенов для каждого слова, чем использовать один токен для n слов. Но в этом случае у меня будут правила с 1000 + токенами, что не похоже на лучшую идею;

  2. Я мог бы изменить диспетчер токенов или построить его, чтобы он просто соответствовал словам в списке;

  3. Здесь я знаю, что лексер - конечный автомат, и именно поэтому это невозможно, так что все равно использовать другой лексер? ;

  4. Я могу автоматически генерировать огромное регулярное выражение, которое соответствует каждому слову, но это не позволило бы мне обрабатывать слова независимо после этого, и я не уверен, что писать регулярное выражение на 60 строк будет отличная идея;

  5. Может быть, есть способ загрузить токен из файла, это решение довольно близко к решениям 2 и 3;

  6. Возможно, мне нужен другой язык? Я пытаюсь перейти от XLE (который может обрабатывать лексикон из более чем 70 000 токенов) в java, и здесь интересно создать java-файлы!

Так вот, я могу найти способ обработать несколько тысяч токенов с помощью javacc lexer. Было бы здорово, если бы кто-то использовал это и имел идею?

Лучшие

Корантен

+0

Если вы используете JavaCC для создания синтаксического анализатора, вы можете использовать пользовательский лексер (см. Параметр 'USER_TOKEN_MANAGER'), который использует технику реализации, описанную ниже в @rici. Если вам нужен только лексер, JavaCC, скорее всего, не лучший инструмент. –

ответ

3

Я не знаю, как JavaCC строит свой DFA, но уверен, что DFA способен различать тысячи слов будет достаточно большим. (Но отнюдь не неоправданно большой: мне удалось построить DFA с сотнями тысяч государств без серьезных проблем.)

Обычный подход к лексиконам с огромным количеством фиксированных лексем заключается в использовании DFA для распознавания потенциальное слово (например, последовательность алфавитных символов), а затем посмотрите слово в словаре, чтобы получить тип маркера. Это также более гибко, потому что вы можете обновить словарь без перекомпиляции.

 Смежные вопросы

  • Нет связанных вопросов^_^