Я хочу работать на игрушечном языке с помощью парсера Flex/Bison с привязками к Rust. Для простоты я бы хотел, чтобы Bison просто вызвал функцию , определенную Rust для каждого согласованного правила, чтобы создать конкретное дерево синтаксиса (которое будет переведено в AST в Rust для дальнейшей обработки). Вызов функции должен включать соответствующий тип правила в качестве аргумента, чтобы мой код Rust знал, какой тип узла он (выражение, if-statement, while-statement, вызов функции, литеральная строка, число и т. Д.).Автоматически сгенерированный знак битса Enum
Просматривая сгенерированный анализатор Bison, похоже, что существует переменная yyn
, которая, как представляется, представляет собой целое число, представляющее согласованное правило, хотя я не видел его документально нигде. Я знаю, что опция %defines
даст мне перечисление токенов в parser.tab.h
, но мне нужны перечисленные как конечные, так и нетерминальные символы. Я также видел опцию %token-table
, которая также дает нетерминальные символы, но не совсем то, что мне нужно, а также идет прямо в файл parser.tab.c
, а не файл parser.tab.h
, что затрудняет использование чего-то вроде rust-bindgen.
Итак, есть ли способ, чтобы Bison генерировал перечисление, аналогичное перечислению yytokentype
, которое включает в себя нетерминальные символы и помещается в заголовочный файл? Или я застрял в определении моего собственного перечисления для типов узлов КНТ, которые совпадают с символами, которые у меня есть? Является ли yyn
документированным где угодно? Безопасно ли использовать в качестве способа определения правила, которое было согласовано в действии? Есть ли лучший способ, которым я могу это сделать?