FSM log parser

by whelkaholism

HTML

<div id="t"></div>
<hr/>
<div id="d"></div>

CSS

#t { 
  color: blue;
  white-space: pre-wrap
 }

JavaScript

var text ='reason=refrefes, original=[MonthlyRent=1500.00,A=B,C=[D=E]], issuedtolandlord=False, issuedtotenants=[Rob,Stu], rent=Recalculated\\, okay';

//var text ='a=hi\\,there, b=world';

var log = function(msg, c, state)
{
	document.getElementById('d').innerHTML += msg + (c ? ' "' + c + '"' : '') + '</br>';
}

var Logging = {};
Logging.deserializeMessage = function(s)
{
	var res = {};
  
  var currname = '';
  var currvalue = '';
  var curr = res;
  var stack = [res];
  
  var f_addtoarr = function(o, n)
  {
  	o['[]'] = o['[]'] || [];
    o['[]'].push(n);
  };
  
	var actions =  {
    	buildprop: function(c, s) { currname += c; log('buildprop', c, s);},
    	addprop: function(c, s) { curr[currname] = null; log('addprop', c, s);},
    	addpropasvalue: function(c, s) { f_addtoarr(curr, currname); currname = ''; log('addpropasvalue', c, s);},
      //
    	buildvalue: function(c, s) { currvalue += c; log('buildvalue', c, s); },
    	addvalue: function(c, s) { curr[currname] = currvalue; currname = ''; currvalue = ''; log('buildvalue', c, s); },
      //
      push: function(c, s) { curr[currname] = {}; curr = curr[currname]; stack.push(curr); currname = ''; log('push (-> ' + JSON.stringify(curr) + ')'); },
      pop: function(c, s) { if(currname) {  f_addtoarr(curr, currname); currname = ''; } stack.pop(); curr = stack[stack.length - 1]; log('pop (-> ' + JSON.stringify(curr) + ')'); }
   };

	var transitions = {
  	'_reserved': { '=':true, ',':true, '[':true, ']':true },
    '_escape': '\\',
  	'_start': {
      '*': { s: 'propname', a: actions.buildprop }
    },
  	'propname': {
      '=': { s: 'value', a: actions.addprop },
      ',': { a: actions.addpropasvalue },
      ']': { s: 'skip', a: actions.pop },
      '*': { a: actions.buildprop }
    },
  	'value': {
      ',': { s: 'propname', a: actions.addvalue },
      '[': { s:'propname', a: actions.push },
      ']': { s: 'skip', a: [actions.addvalue, actions.pop] }, //!!!
      '*': { a: actions.buildvalue...