Всем привет! Нисходящим парсером возможно реализовать разбор конструкций при которых нужно заглядывать на n токенов вперёд?
Наведу простой пример, vector<int64>() - expression, мы считываем токен Ident vector, затем следует токен Less < и у нас дилемма. То ли это InfixExpr (0 < 1), или же CallExpr ( vector<int64>(args) ) . При восходящем парсере это возможно было бы реализовать сверткой, но для этого требуется использовать уже существующие парсер-генераторы или писать свой (чего я не могу сделать, так как знаний очень мало в этой теме). Хотелось бы использовать LL(k) парсер, так как я его уже написал и хотелось бы его модифицировать под этим цели.
Знающие люди поправьте меня, но с вашим примером должно получится примерно следующее же.
Делая предположение что лексинг и парсинг это две разные стадии, получаем:
Lexing
- - -
vector<int64>() =
IDENTIFIER «vector»
LESS
IDENTIFIER «int64»
GREATER
LEFT_PAREN
RIGHT_PAREN
- - -
Имея такой набор токенов можно дальше сделать проверку типа такую: Если текущий токен = LESS, то попытаться распарсить следующую последовательность как (IDENTIFIER | (IDENTIFIER «,»)) GREATER. Если получилось то гуд. Если нет, то вернуться на токен LESS и парсить пробовать Infix