野牛无类型非终结

时间:2016-11-18 20:47:21

标签: c++ bison

据我所知,Bison声明的形式为 %type <type> nonterminal

有没有办法在不给它类型的情况下定义非终结符?

1 个答案:

答案 0 :(得分:0)

#include <ros/ros.h> #include <std_msgs/String.h> #include "../include/heart_rate_monitor/wfdb.h" #include <stdio.h> #include <sstream> #include <iostream> #include <fstream> #include <iomanip> #include <algorithm> #include <deque> static std::deque<std::string> queue_buffer; static int entries_added_since_last_write = 0; void write_data_to_file() { // open file std::ofstream data_file("my_data_file.txt"); if (data_file.is_open()) { for (int i = 0; i < queue_buffer.size(); ++i) { data_file << queue_buffer[i] << std::end; } } else { std::cout << "Error - Cannot open file." << std::endl; exit(1); } data_file.close(); } void process_message(const std_msgs::String::ConstPtr& string_msg) { // if buffer has already 60 entries, throw away the oldest one if (queue_buffer.size() == 60) { queue_buffer.pop_front(); } // add the new data at the end queue_buffer.push_back(string_msg.data); // check if 10 elements have been added and write to file if so entries_added_since_last_write++; if (entries_added_since_last_write == 10 && queue_buffer.size() == 60) { // write data to file and reset counter write_data_to_file(); entries_added_since_last_write = 0; } } int main(int argc, char **argv) { ros::init(argc, argv, "writer"); ros::NodeHandle n; ros::Subscriber sub = n.subscribe("/HeartRateInterval", 1000, process_message); ros::spin(); return 0; } 实际上定义非终端 - 它设置了在其他位置定义的非终端的类型。某些版本的bison会为%type提供一个未定义的非终端警告,但其他版本只会忽略它。

您可以通过在左侧(%type之前)给出一个非终端规则来定义非终端。