summaryrefslogtreecommitdiff
path: root/src/system.yy
diff options
context:
space:
mode:
Diffstat (limited to 'src/system.yy')
-rw-r--r--src/system.yy160
1 files changed, 146 insertions, 14 deletions
diff --git a/src/system.yy b/src/system.yy
index af64edd..5ee7f96 100644
--- a/src/system.yy
+++ b/src/system.yy
@@ -10,6 +10,7 @@
using namespace std;
Entry::System msg;
+bool legacy = true;
%}
@@ -18,19 +19,26 @@ Entry::System msg;
%define api.token.constructor
%define api.value.type variant
+%define parse.error detailed
+%define parse.trace true
+
%code requires // *.hh
{
#include <cstdint>
#include "lexer.h"
+#include "system.loc.hh"
}
-%parse-param {Lexer<symbol_type> &lexer}
+//%locations
+//%define api.location.type {yy::location}
+%parse-param {Lexer<symbol_type> &lexer}
%token <uint64_t> NUM
%token <double> FRC
+%token <int> TOKEN
%token BREAK BLANK START END VERSION CPU BASE USER NICE
-%token SYSP IDLE IOWP IRQP SIRQ CORE MEM TOTAL CACHE SHARED
-%token TSWAP USWAP TEMP CURR TMIN TMAX TAVG COLON SLASH
+%token SYSP IDLE IOWP IRQP SIRQ CORE MEM TOTAL AVAIL CACHE
+%token SHARED TSWAP USWAP TEMP CURR TMIN TMAX TAVG COLON SLASH
%%
@@ -41,22 +49,20 @@ start:
;
block:
- block_start data block_end
+ block_start data_block block_end
;
block_start:
START BLANK NUM BREAK {
+ cout << "begin\t" << $NUM << endl;
msg.set_epoch($<uint64_t>3);
}
;
block_end:
END BLANK NUM BREAK {
- if ($<uint64_t>3 != msg.epoch()) {
- msg.Clear();
- cout << $<uint64_t>3 << endl;
- } else {
- cout << $<uint64_t>3 << endl;
+ if ($<uint64_t>3 == msg.epoch()) {
+ cout << "end\t" << $NUM << endl;
auto p = filesystem::path("proto");
p /= to_string($<uint64_t>3);
p += string(".proto");
@@ -64,10 +70,138 @@ block_end:
msg.SerializeToOstream(&f);
f.close();
}
+ msg.Clear();
+ }
+
+data_block:
+ version_block data_list
+ ;
+
+version_block:
+ VERSION BLANK NUM BLANK NUM BREAK {
+ legacy = false;
+ cout << "ver\t" << $3 << "\t" << $5 << endl;
}
+ | /* legacy */ { }
+ ;
+
+data_list:
+ data BREAK | data BREAK data_list;
data:
-;
+ CPU BLANK cpu_block
+ | MEM BLANK mem_block
+ | TEMP BLANK temp_block
+ ;
+
+cpu_percent:
+ USER { $<int>$ = yylhs.kind(); cout << $<int>$; }
+ | NICE { $<int>$ = yylhs.kind(); }
+ | SYSP { $<int>$ = yylhs.kind(); }
+ | IDLE { $<int>$ = yylhs.kind(); }
+ | IOWP { $<int>$ = yylhs.kind(); }
+ | IRQP { $<int>$ = yylhs.kind(); }
+ | SIRQ { $<int>$ = yylhs.kind(); };
+
+cpu_block:
+ BASE BLANK FRC BLANK NUM {
+ ([&] (auto base) {
+ base->set_usage($<double>3);
+ base->set_clock($<uint64_t>5);
+ cout << "cpu\tbase\t" << base->usage() << "\t" << base->clock() << endl;
+ })(msg.mutable_cpu()->mutable_base());
+ }
+ | cpu_percent BLANK FRC BLANK FRC {
+ cout << $<int>1 << endl;
+ string name = ([&](auto t) {
+ switch(t) {
+ case token_type::USER: return "user";
+ case token_type::NICE: return "nice";
+ case token_type::SYSP: return "system";
+ case token_type::IDLE: return "idle";
+ case token_type::IOWP: return "iowait";
+ case token_type::IRQP: return "hwirq";
+ case token_type::SIRQ: return "swirq";
+ default: return "undefined";
+ }
+ })($<int>1);
+
+ ([&] (auto a, auto b) -> void {
+ ::Entry::CPUStats_Subsystem sys;
+ sys.set_curr(a);
+ sys.set_diff(b);
+ msg.mutable_cpu()->mutable_subsystem()->insert({name, sys});
+ cout << "cpu\t" << name << "%\t" << msg.cpu().subsystem().at(name).curr()
+ << "\t" << msg.cpu().subsystem().at(name).diff() << endl;
+ })($<double>3, $<double>5);
+
+ }
+ | CORE NUM BLANK FRC BLANK NUM {
+ ([&] (auto core, auto a, auto b) -> void {
+ ::Entry::CPUStats_Core c;
+ c.set_usage(a);
+ c.set_clock(b);
+ msg.mutable_cpu()->mutable_cores()->insert({core, c});
+
+ cout << "cpu\tcore:" << core << "\t" << msg.cpu().cores().at(core).usage()
+ << "\t" << msg.cpu().cores().at(core).clock() << endl;
+ })($<uint64_t>2, $<double>4, $<uint64_t>6);
+
+ }
+ ;
+
+mem_type:
+ TOTAL { $<int>$ = 1; }
+ | AVAIL { $<int>$ = 2; }
+ | CACHE { $<int>$ = 3; }
+ | SHARED { $<int>$ = 4; }
+ | TSWAP { $<int>$ = 5; }
+ | USWAP { $<int>$ = 6; }
+ ;
+
+mem_block:
+ mem_type BLANK NUM {
+ ([&](auto mem, int t, uint64_t v) {
+ cerr << yystack_[2].kind() << ":" << endl;
+ cout << "mem\t";
+ switch((int)t) {
+ case token_type::TOTAL: mem->set_total(v); cout << "\ttotal" << msg.mem().total(); break;
+ case token_type::AVAIL: mem->set_avail(v); cout << "\tavail" << msg.mem().avail(); break;
+ case token_type::CACHE: mem->set_cache(v); cout << "\tcache" << msg.mem().cache(); break;
+ case token_type::SHARED:mem->set_share(v); cout << "\tshare" << msg.mem().share(); break;
+ case token_type::TSWAP: mem->set_tswap(v); cout << "\ttswap" << msg.mem().tswap(); break;
+ case token_type::USWAP: mem->set_uswap(v); cout << "\tuswap" << msg.mem().uswap(); break;
+ default: break;
+ }
+ cout << endl;
+ })(msg.mutable_mem(), $<int>1, $<uint64_t>3);
+ }
+ ;
+temp_block:
+ tmp_current
+ | tmp_legacy
+ ;
+
+tmp_current_type: CURR | TMIN | TMAX | TAVG;
+tmp_current:
+ tmp_current_type BLANK NUM {
+ if (legacy) throw syntax_error("TEMP Block in legacy data.");
+
+ using token = yy::parser::token::token_kind_type;
+ ([&](auto tmp, token t, uint64_t v) {
+ switch(t) {
+ case token::CURR: tmp->set_cur(v); break;
+ case token::TMIN: tmp->set_min(v); break;
+ case token::TMAX: tmp->set_max(v); break;
+ case token::TAVG: tmp->set_avg(v); break;
+ default: break;
+ }
+ })(msg.mutable_tmp(), $<token>1, $<uint64_t>3);
+ }
+ ;
+
+tmp_legacy:
+ ;
%%
namespace yy
@@ -75,14 +209,12 @@ namespace yy
// Report an error to the user.
auto parser::error (const std::string& msg) -> void
{
- std::cerr << msg << '\n';
+ std::cerr << msg << " on line " << lexer.lineno() << '\n';
}
}
-#undef PARSER_SOURCE
-#include "lexer.h"
-
int main() {
+
Lexer<yy::parser::symbol_type> lexer;
yy::parser parse(lexer);