Конечно. PL / 1 известен тем, что не имеет никаких зарезервированных слов, например, вы можете использовать ключевые слова (например, IF ) в качестве имени переменной везде, где это не требуется в качестве ключевого слова:
IF IF = 1 THEN ELSE=3; ELSE END=4;
Построить парсер, который делает это сложнее. Вы не можете сделать это «просто» в лексере, потому что он не знает контекста, в котором идентификатор может быть ключевым словом или нет.
Есть несколько выходов. Когда идентификатор, подобный сущности, найден:
1) Заставьте лексера спросить парсер: " Вы хотите ключевое слово сейчас? ". В этом случае создайте ключевое слово. Заставить парсер сотрудничать здесь может быть сложно. Может также случиться так, что парсер не знает, потому что он должен видеть больше входных данных, чтобы принять решение. Рассмотрим знаменитое утверждение формата Фортрана:
FORMAT ( A1, I2, ... ) X
Вы не можете сказать, когда видите слово «FORMAT», является ли оно ключевым словом или идентификатором; Вы должны сканировать произвольно далеко вперед, чтобы осмотреть X. Если X - это не конец оператора, слово FORMAT - это имя идентификатора массива; если X - конец статистики, это ключевое слово FORMAT и оператор.
2) Выдает как ключевое слово (если идентификатор совпадает с одним), так и идентификатор, и заставляет парсер пробовать оба. Большинство парсеров не справятся с этим хорошо, но GLR парсеры могут справиться с этим с апломбом, если они разумно спроектированы. Это решает проблему FORMAT тривиально, добавляя в анализатор возможности просмотра. (ANTLR - это не GLR. Наш инструментарий реинжиниринга программного обеспечения DMS имеет именно такой анализатор GLR, и мы часто используем этот прием).
3) Поместите все подобные идентификатору вещи в хеш-таблицу. Используйте парсер рекурсивного спуска (ANTLR - один); когда этот синтаксический анализатор хочет ключевое слово, он просто проверяет полученный идентификатор, чтобы убедиться, что это ключевое слово, в котором он нуждается. Если ему не нужно ключевое слово, он просто использует идентификатор в качестве идентификатора. Я не знаю, как реализовать этот трюк с ANTLR, так как я не использую его. Это не справится с делом «не могу решить без предвкушения».