Регистронезависимое соответствие ключевых слов
Я пишу грамматику для разбора компьютерного языка, который можно использовать с Parse::Eyapp. Это пакет Perl, который упрощает написание синтаксических анализаторов для обычных языков. Он похож на yacc и другие генераторы синтаксического анализатора LALR, но имеет некоторые полезные расширения, такие как определение токенов в терминах регулярных выражений.
Язык, который я хочу проанализировать, использует ключевые слова для обозначения разделов и описания потока управления. Он также поддерживает идентификаторы, которые служат заполнителями для данных. Идентификатор никогда не может иметь того же имени, что и ключевое слово.
Теперь здесь есть сложная часть: мне нужно отделить ключевые слова от идентификаторов, но они могут выглядеть одинаково, поэтому мне нужен шаблон регулярного выражения, который соответствует идентификатору без учета регистра, и ничего больше.
Решение, которое я придумал, заключается в следующем:
- Каждое ключевое слово идентифицируется токеном следующей формы:
/((?i)keyword)(?!\w)/
(?i)
будет применять регистронезависимое соответствие для следующего подшаблона(?!\w)
не будет принимать символы слова (az, 0-9 и т. д.) после ключевого слова- эти персонажи не будут частью матча
- Ключевые слова, которые совпадают с началом другого ключевого слова, перечислены после более длинного ключевого слова, поэтому они соответствуют первому
- Токен для совпадающих идентификаторов стоит последним, поэтому он будет совпадать только тогда, когда ключевое слово не распознано.
Определения токенов и часть грамматики, которые я придумал, хорошо работают, но многое еще предстоит сделать. Однако это не мой вопрос.
Я хотел спросить: я на правильном пути? Есть ли лучшие, более простые регулярные выражения для сопоставления этих ключевых слов? Должен ли я остановиться и использовать другой подход для синтаксического анализа вообще?
Кстати, идея использовать токенизатор для сопоставления целых строк, а не отдельных символов, возникла из документации Parse::Eyapp. Сначала я начал с посимвольной грамматики, но этот подход не был очень элегантным и, кажется, противоречит гибкой природе генератора синтаксического анализатора. Писать тоже было очень громоздко.
1 ответ
Если вы хотите разобрать язык, возможно, Марпа лучше вам подойдет. Вот учебник. Вы также можете использовать регулярные выражения грамматики.