Link如下:
Proto Visualizer

以前为前东家打工的时候,通信协议主要是json(其实是二进制化的json),然后查问题基本只靠这个神器:
Json Visualization
这样繁复的json可以瞬间转化成可视化的表格,事半功倍。并且所有的转换操作都是在浏览器里面做的,也不用担心安全问题。
但现在的工作已经很少用到json了,反而是越来越多地使用pb,但pb这个的文本格式也不是很好读,并且有时候为了把一条信息打印到一行中,不得不使用ShortDebugString(), 这样使得文本更难看懂……
然后今天突然想到一个idea,既然网上那么多json visualization的工具,是不是我可以来一把曲线救国,先把pb转换成json,这样不就成了!
然后就真的找到了一个js版本的lex-yacc, http://zaach.github.io/jison/ , 然后我就写了这样的语法规则:
/* description: Proto2Json Converter */
/*lex*/
%lex
%x string
%%
s+ /* skip whitespace */
[-0-9]+("."[0-9]+)?("e+"[0-9][0-9])?b return 'NUMBER'
[a-zA-Z0-9_x5Dx5B\.]+ return 'ID'
"{" return '{'
"}" return '}'
":" return ':'
""" this.begin('string');
/*""" this.popState();*/
(\"|[^"])*""" this.popState();yytext = """ + yytext;return 'STRING';
<> return 'EOF'
. return 'INVALID'
/lex
%start expressions
%%
expressions
: object EOF
{ console.log(JSON.stringify($1, null, 4)); return $1;}
;
object
: kv_list
%{
result = {}
$kv_list.forEach(function (kv) {
k = kv["key"];
v = kv["value"];
if (result[k] != undefined) {
if (result[k] instanceof Array) {
result[k] = result[k].concat([v]);
} else {
result[k] = [result[k]].concat([v]);
}
} else {
result[k] = v;
}
});
$$ = result;
%}
;
kv
: key_type ":" literal_value
{$$ = {"key": $key_type, "value": $literal_value};}
| key_type "{" object "}"
{$$ = {"key": $key_type, "value": $object};}
| key_type "{" "}"
{$$ = {"key": $key_type, "value": {}};}
;
key_type
: ID
| NUMBER
;
literal_value
: NUMBER
| STRING {$$ = eval($STRING);}
| ID
;
kv_list
: kv
{$$ = [$kv];}
| kv kv_list
{$$ = [$kv].concat($kv_list);}
;
发现其实没有原来想得那么麻烦, 与其不停期盼为啥没这么一个工具,不如自己动动手。
blog也好久没新文章了,锄锄草。