Я создаю компилятор с Lex и YACC (на самом деле Flex и Bison). Язык позволяет неограниченно пересылать ссылки на любой символ (например, C#). Проблема в том, что невозможно разобрать язык, не зная, что такое идентификатор.Как реализовать прямые ссылки в компиляторе?
Единственное решение, о котором я знаю, это лекс всего источника, а затем выполнить синтаксический анализ «в ширину», поэтому элементы более высокого уровня, такие как объявления классов и объявления функций, анализируются перед функциями, которые их используют. Однако для больших файлов потребуется большой объем памяти, и с YACC было бы сложно справиться (мне пришлось бы создавать отдельные грамматики для каждого типа объявления/тела). Мне также пришлось бы вручную написать lexer (что не так уж и много).
Меня не интересует эффективность (хотя это все еще важно), потому что я собираюсь переписать сам компилятор, как только закончу его, но я хочу, чтобы эта версия была быстрой (так что если любые быстрые общие методы, которые не могут быть выполнены в Lex/YACC, но могут быть сделаны вручную, пожалуйста, предложите их также). Таким образом, сейчас самым важным фактором является легкость развития.
Есть ли хорошие решения этой проблемы? Как это обычно делается в компиляторах для таких языков, как C# или Java?
Это не имеет ничего общего с ключевыми словами. Это больше похоже на: ABC (пакет AB). (Класс C), (пакет A) (класс B). (Поле C) или (заданный A). (Поле B). (Поле C) и т. Д. – Zifre
Затем применяется второй абзац моего ответа. Вам не нужно разбираться в этом. Рассматривать '.' как оператор в вашей грамматике. В ваших тестах AST вы можете проверить их на таблице символов. – U62
Ну, мне кажется, мне нужно просто создать дерево разбора, а не АСТ. Как вы сказали, они разные. Если никто другой не придумает лучшего ответа, я соглашусь с этим, но я бы не хотел этого делать так ... – Zifre