peg.jsにおいて
以下のようなparserを書きました

perser.pegjs

Start
= c:(Content+) EOL {
  return c;
}

Content 
= openId:OpenTag c:(Content)+ closeId:CloseTag {
    if (openId !== closeId) {
        throw new Error( "expect </ " + openId+ "> but </" + closeId + ">");
    }
    return { type:'element', id:openId, content:c};
}
/txt:ContentText {
  return {type:'txt', content:txt.trim()}
}


ContentText = [^<>\n]+ { return text();}

OpenTag = "<" id:[0-9]+ ">" { return parseInt(id.join(''))}
CloseTag = "</" id:[0-9]+ ">" { return parseInt(id.join(''))}


EOL = [\n]*

以下の入力を受け取りjsonを吐きます

<1>abc</1><2>def<3>ghi</3></2>

出力

[
   {
      "type": "element",
      "id": 1,
      "content": [
         {
            "type": "txt",
            "content": "abc"
         }
      ]
   },
   {
      "type": "element",
      "id": 2,
      "content": [
         {
            "type": "txt",
            "content": "def"
         },
         {
            "type": "element",
            "id": 3,
            "content": [
               {
                  "type": "txt",
                  "content": "ghi"
               }
            ]
         }
      ]
   }
]

このparserではContentText に <,> を含めることが出来ませんが
なんとか含ませたい場合どの様にparserをかけばよろしいでしょうか?