diff options
author | 2024-11-15 14:23:28 +0600 | |
---|---|---|
committer | 2024-11-15 14:23:28 +0600 | |
commit | d4c8acb4dd621cb95c3c22020b3c546bcb5d5a2d (patch) | |
tree | 654e411261b4e6db24cccc6fe1eb3ca6b2e11bb7 | |
parent | e0139539359c0f3bec41b8ba37438f8026975774 (diff) | |
download | log-parser-d4c8acb4dd621cb95c3c22020b3c546bcb5d5a2d.tar.gz log-parser-d4c8acb4dd621cb95c3c22020b3c546bcb5d5a2d.zip |
Implement full v3.0 grammar
Signed-off-by: Mubashshir <ahmubashshir@gmail.com>
-rw-r--r-- | .gitignore | 11 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/system.l | 3 | ||||
-rw-r--r-- | src/system.yy | 160 |
4 files changed, 156 insertions, 20 deletions
@@ -1,9 +1,10 @@ * !**/ -!Makefile +!/Makefile !.gitignore -!src/lexer.h -!src/system.l -!src/system.proto -!src/system.yy +!src/*.h +*.pb.h +!src/*.l +!src/*.proto +!src/*.yy !test/*.log @@ -48,4 +48,4 @@ clean: @$(RM) -f $(<<objects>>) $(BINARY) .PHONY: all clean install uninstall test -.INTERMEDIATE: src/system.lex.cc src/system.pb.h src/system.tab.cc src/system.tab.hh +#.INTERMEDIATE: src/system.lex.cc src/system.pb.h src/system.tab.cc src/system.tab.hh diff --git a/src/system.l b/src/system.l index b77255e..6c3cfb7 100644 --- a/src/system.l +++ b/src/system.l @@ -2,10 +2,12 @@ %option noyywrap %option debug %option yyclass="Lexer" +%option yylineno %{ #include <iostream> #include "system.tab.hh" +#include "system.loc.hh" #undef YY_DECL # define YY_DECL template<> parser::symbol_type Lexer<parser::symbol_type>::yynlex () @@ -39,6 +41,7 @@ core: { return parser::make_CORE(); } mem { return parser::make_MEM(); } total { return parser::make_TOTAL(); } +avail { return parser::make_AVAIL(); } cache { return parser::make_CACHE(); } share { return parser::make_SHARED(); } tswap { return parser::make_TSWAP(); } 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); |