int sum(int,int);
int proc(int a,int b){
return sum(a,b);
}
int sum(int a,int b){
return a+b;
}
Почему в классах, это не требуется?
Вообще с++ компиляторы они
однопроходные или двухпроходные? Если судить по правилам декларирования функций. То должны быть однопроходными. И AST дерево на лету как в
книге Дракона пример можно писать.
Или синтактический анализ у класса по другому работает?
К примеру каким образом при синтактическом анализе можно определить приведения типов. Вообще там много примеров.
И для каждого из 3 примеров, еще условия
- Тип уже определен выше, и находится в таблице символов(такое решаемо)
- Тип не определен, и может быть ниже, как java c# jc, ( не знаю как решить)
(A)a
(A)*a -> например тут это умножение или приведение типа
(A*)++a; -> а вот тут как определить Это постфиксный или префиксный инкремент ++
((((((((((((A::B::C::D::L*)))))))))++ + ++( ... ); такой пример можно выдумать.
В вики есть статья Lexer Hack, но после слова
неэлегантно я закрыл, слишком большая жертва.
У меня есть решение, но которое мне не нравится, и не нашел что бы так делали, это разбить весь файл на токены первым проходом. После этого пройтись по токенам, и конкретизировать их уже.
К примеру что примеры кода, что статьи, везде такое вижу, что Парсер и Лексер работают одновременно в режиме, запрос-ответ как по картинке. А как тогда можно решить задачу, это идентификатор типа или переменной, если она определена ниже.