2017-08-27 28 views
0

我想解析從.RC(資源定義文件)到JSON的數據使用js與簡單的fs.readFile函數,但是我得到SyntaxError:無效或意外的標記。目前我找不到解析這種類型文件的其他解決方案,請爲我提供輸入。以下是.RC示例。如何使用JavaScript解析一個.RC文件

#include "shapes.h" 

ShapesCursor CURSOR SHAPES.CUR 
ShapesIcon ICON SHAPES.ICO 

ShapesMenu MENU 
{ 
    POPUP "&Shape" 
    { 
    MENUITEM "&Clear", ID_CLEAR 
    MENUITEM "&Rectangle", ID_RECT 
    } 
} 

我發現節點的包叫做「Jison」,這是建立在JavaScript解析器類似於「PegJS」的API,但是我無法找出需要爲我的文件中寫的語法如果它支持文件類型,也鍵入。該分析的結構看上去就像,

{ 
    "directive": [ 
     "include", 
     "shapes.h" 
    ], 
    "data": [ 
     { 
      "name": "ShapesCursor", 
      "values": [ 
       "CURSOR", 
       "SHAPES.CUR" 
      ], 
      "children": [] 
     }, 
     { 
      "name": "ShapesIcon", 
      "values": [ 
       "CURSOR", 
       "SHAPES.ICO" 
      ], 
      "children": [] 
     }, 
     { 
      "name": "POPUP", 
      "values": [ 
       "&Shape" 
      ], 
      "children": [ 
       { 
        "name": "MENUITEM", 
        "values": [ 
         "&Clear", 
         "ID_CLEAR" 
        ], 
        "children": [] 
       }, 
       { 
        "name": "MENUITEM", 
        "values": [ 
         "&Rectangle", 
         "ID_RECT" 
        ], 
        "children": [] 
       } 
      ] 
     } 
    ] 
} 
+0

[JSON](http://www.json.org/)是一個良好定義的格式(檢查[MDN DOC](https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Reference/Global_Objects/JSON)),我不確定這些文件是否存在JS解析器。 你有來自另一種語言的示例實現嗎?請收集更多細節和[編輯]你的問題。 – LEI

+0

我在節點中找到一個名爲'Jison'的包,這是一個用於在JavaScript中創建類似於'PegJS'的解析器的API,但是我找不出需要爲我的文件類型編寫的語法,如果它支持文件類型。 –

+0

如果你想覆蓋一個庫及其邊緣案例,編寫你自己的解析器可能是一個巨大的任務。也許提供一些鏈接到資源文件doc。 – LEI

回答

0

下面的語法可用於分析資源描述文件到JSON。

{ 
    var word_Obj = {}; 
    var word_alnum_Obj = {}; 
    var word_alnumsp_Obj = {}; 
    var dir_Obj = {}; 
    var valStateDec_Obj = {}; 
    var stateName_Obj = {}; 
    var valStateVal_Obj = {}; 
    var word_Count = 0; 
    var word_alnum_Count = 0; 
    var word_alnumsp_Count = 0; 
    var dir_Count = -1; 
    var valStateDec_Count = 0; 
    var stateName_Count = -1; 
    var valStateVal_Count = -1; 
    var begin_Count = -1; 
    var end_Count = -1; 
    var child_Count = -1; 
    var children_Count = -1; 
    var flag = 0; 
} 
Expected = dir:directive * nl * states:state nl* Ending:EOL {if (begin_Count === end_Count) { return { Parsed_RC: { Directive_Obj: dir, States_Obj: states, ENDING: Ending } } } else { return "Incorrect .RC file" } } 
directive = "#" d: word space* v:word_alnumsp nl+ { dir_Count++; dir_Obj = { ['Directive_' + dir_Count]: { "Dir": d, "_text": v } }; return dir_Obj;} 
state = (valState looping)* 
    looping = (loopStart loopEnd*)* 
     loopStart = beg child: valState + { begin_Count++; children_Count++; child_Count++; return {['loopStart_' + begin_Count]: begin_Count, ['child_' + children_Count]: child } } 
loopEnd = end {end_Count++; child_Count--; return { ['loopEnd_' + end_Count]: end_Count }; } 
valState = stateName(valStateVal) * nl + 
    //valStateDec = space+ decState_val:word_alnumsp {valStateDec_Count++; valStateDec_Obj = {['ValStateDec_Obj'+valStateDec_Count]:decState_val}; return valStateDec_Obj;} 
    stateName = space * state_name:word_alnumsp {if (state_name === 'BEGIN') { begin_Count++; children_Count++; child_Count++; return { ['loopStart_' + begin_Count]: begin_Count } } if (state_name === 'END') { end_Count++; child_Count--; return { ['loopEnd_' + end_Count]: end_Count }; } if (child_Count < 0) { flag = 1; } stateName_Count++; stateName_Obj = { ['StateName_Obj' + stateName_Count]: state_name }; return stateName_Obj; } 
valStateVal = space + valState_val:(word_alnumsp comma?)* { valStateVal_Count++; valStateVal_Obj = { ['_attributes_Obj' + valStateVal_Count]: valState_val }; return valStateVal_Obj} 
word = wo:letter + { return wo.join("") } 
word_alnum = al:alnum + { return al.join("") } 
word_alnumsp = alsp:alnumsp + { return alsp.join("") } 

beg = space * ([{]) space* nl + 
    end = space * ([}]) space* nl + 
     comma = space * [,] space* { return ","} 

letter = [a - zA - Z] 
alnum = [a - zA - Z0 - 9] 
alnumsp = [a - zA - Z0 - 9"'&._()\\|+:] 
    space = " " 
    nl = '\n' {valStateVal_Count = -1; return "NL"} 
    EOL = !. {return "EOF"}