Контекстно-зависимый лексер - PullRequest
0 голосов
/ 14 февраля 2019

Я вижу следующее в bash's parse.y.Это означает, что лексический анализ будет зависеть от контекста.Как использовать flex для такого рода контекстно-зависимого анализа?Сможет ли такой вид зависимого от контекста требования усложнять гибкий код?Спасибо.

http://git.savannah.gnu.org/cgit/bash.git/tree/parse.y#n3006

/* Handle special cases of token recognition:
  IN is recognized if the last token was WORD and the token
  before that was FOR or CASE or SELECT.

  DO is recognized if the last token was WORD and the token
  before that was FOR or SELECT.

  ESAC is recognized if the last token caused `esacs_needed_count'
  to be set

  `{' is recognized if the last token as WORD and the token
  before that was FUNCTION, or if we just parsed an arithmetic
  `for' command.

  `}' is recognized if there is an unclosed `{' present.

  `-p' is returned as TIMEOPT if the last read token was TIME.
  `--' is returned as TIMEIGN if the last read token was TIMEOPT.

  ']]' is returned as COND_END if the parser is currently parsing
  a conditional expression ((parser_state & PST_CONDEXPR) != 0)

  `time' is returned as TIME if and only if it is immediately
  preceded by one of `;', `\n', `||', `&&', or `&'.
*/

1 Ответ

0 голосов
/ 14 февраля 2019

(F) lex предоставляет условия запуска для учета контекстно-зависимого лексического анализа.

Если вы избегаете искушения воспроизвести логику синтаксического анализа как рукописный конечный автомат вЛексический сканер, тогда условия запуска, безусловно, могут упростить реализацию контекстно-зависимых сканеров.

Для конкретного применения условно-распознаваемых ключевых слов - часто называемых «полурезервированными словами» - контекстно-зависимый лексический анализ часто не является лучшим решением.Вместо этого попробуйте написать сканер, чтобы всегда распознавать ключевые слова, а затем добавить правила в грамматику, чтобы рассматривать слова как идентификаторы в контекстах, в которых ключевое слово невозможно.См. этот ответ для примера.

...