Регистронезависимое соответствие ключевых слов

Я пишу грамматику для разбора компьютерного языка, который можно использовать с Parse::Eyapp. Это пакет Perl, который упрощает написание синтаксических анализаторов для обычных языков. Он похож на yacc и другие генераторы синтаксического анализатора LALR, но имеет некоторые полезные расширения, такие как определение токенов в терминах регулярных выражений.

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

Теперь здесь есть сложная часть: мне нужно отделить ключевые слова от идентификаторов, но они могут выглядеть одинаково, поэтому мне нужен шаблон регулярного выражения, который соответствует идентификатору без учета регистра, и ничего больше.

Решение, которое я придумал, заключается в следующем:

  1. Каждое ключевое слово идентифицируется токеном следующей формы: /((?i)keyword)(?!\w)/
    • (?i) будет применять регистронезависимое соответствие для следующего подшаблона
    • (?!\w) не будет принимать символы слова (az, 0-9 и т. д.) после ключевого слова
    • эти персонажи не будут частью матча
  2. Ключевые слова, которые совпадают с началом другого ключевого слова, перечислены после более длинного ключевого слова, поэтому они соответствуют первому
  3. Токен для совпадающих идентификаторов стоит последним, поэтому он будет совпадать только тогда, когда ключевое слово не распознано.

Определения токенов и часть грамматики, которые я придумал, хорошо работают, но многое еще предстоит сделать. Однако это не мой вопрос.

Я хотел спросить: я на правильном пути? Есть ли лучшие, более простые регулярные выражения для сопоставления этих ключевых слов? Должен ли я остановиться и использовать другой подход для синтаксического анализа вообще?

Кстати, идея использовать токенизатор для сопоставления целых строк, а не отдельных символов, возникла из документации Parse::Eyapp. Сначала я начал с посимвольной грамматики, но этот подход не был очень элегантным и, кажется, противоречит гибкой природе генератора синтаксического анализатора. Писать тоже было очень громоздко.

1 ответ

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

Другие вопросы по тегам