Хобрук: Ваш путь к мастерству в программировании

Использование кода C++ в файле yacc

У меня есть задание, где я должен проанализировать код схемы, чтобы отобразить SVG схемы, используя flex и bison. Я хочу использовать C++ STL, чтобы облегчить себе жизнь, но не смог этого сделать. Вот мой код:

Пример.y

%{
void yyerror (char *s);     /* C declarations used in actions */
#include <stdio.h>
#include <stdlib.h>
%}

.
.
..tokens and grammer....
.
.

int main (void) 
{
    /* init symbol table */
    return yyparse ( );
}

void yyerror (char *s) {fprintf (stderr, "%s\n", s);} 

scan.l

%{
#include "Sample.tab.h"
%}
%%
.
.
lexical rules
.
.
%%
int yywrap (void) {return 1;}

Я пробовал много подходов, таких как использование extern "C", включая yylex(), yyparse и т. д., но это не сработало. Как именно я могу заставить код C++ работать в файле yacc? Я также знаю, что есть подход, при котором мы можем создать третий файл main.cpp и код в нем. Как именно этот подход будет работать? Пожалуйста, скажите, какие изменения мне нужно внести в мой код, чтобы он заработал. Файл отлично работает с C, но не может использовать в нем cout, cin и т.д.

29.03.2018

  • Использование кода C++ непосредственно в файле C, сгенерированном yacc, не совсем безопасно. yacc-сгенерированный код является кодом C, а C++ не является C. Компиляция кода C как C++ не даст таких же результатов, и вы не сможете найти какие-либо ошибки, появившиеся из-за этого. Вместо этого вы должны поместить свой код C++ в специальный файл C++ и вызывать функции из кода yacc. 29.03.2018
  • Даже я хочу следовать этому подходу. Но я не могу это реализовать. Как только я получаю правильное выражение, я хочу сохранить детали в карте или векторе. Как я могу использовать эту функциональность, используя третий файл? Нужно ли мне использовать extern?? Если да, то как именно. 29.03.2018

Ответы:


1

После первого (или каждого) %{ вы указываете

#if defined(__cplusplus)
extern "C" {
#endif

и перед каждым %} вы указываете

#if defined(__cplusplus)
}
#endif

Если вы запустите yacc и откроете сгенерированный файл C, вы увидите, что yacc включает ваш код C или C++ дословно (с переменными $, замененными индексами стека yacc) и включает базовый синтаксический анализатор. Если вы добавите вокруг него директивы C++, он будет скомпилирован как C++. Вам также может понадобиться адаптировать файл yaccpar, который содержит шаблон парсера, в который yacc вставляет свой код.

Если это не поможет, вы можете вручную адаптировать сгенерированный файл C: открыть его и поставить extern "C" { в строке 1 и } в последней строке.

29.03.2018
  • Это работает, но я думаю, что компилировать сгенерированный yacc код C как код C++ - действительно плохая идея. Между языками есть различия — C++ — это не C. Любые ошибки, возникающие при компиляции кода C как кода C++, будут незаметными и их будет невозможно найти, а тем более исправить. 29.03.2018
  • Новые материалы

    Прогресс в технологии Трансформеров часть 3
    Многомасштабный управляющий сигнальный преобразователь для бесфазного синтеза движения (arXiv) Автор: Линтао Ван , Кун Ху , Лей Бай , Юй Дин , Ваньли Оуян , Чжиюн Ван . Аннотация:..

    Представляем поддержку компонентов Vue.js. Мгновенный HMR и многое другое.
    Хотя у FuseBox уже был плагин Vue, он был базовым и не имел многих функций, которые делали работу с Vue.js такой приятной. Однако с этим выпуском мы рады сообщить, что в FuseBox..

    Приключения в Javascript, часть 1
    Я продолжаю думать о том, чтобы писать больше, но чем больше я думаю об этом, тем меньше я это делаю. Итак, сегодня я перестал думать и начал писать. Отсюда можно только спускаться… В..

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..