【问题标题】:how to parse a .RC file using Javascript如何使用 Javascript 解析 .RC 文件
【发布时间】:2017-11-23 23:59:32
【问题描述】:

我正在尝试使用带有简单 fs.readFile 函数的 js 将数据从 .RC(资源定义文件)解析为 JSON,但是我收到 SyntaxError: Invalid or unexpected token。目前我没有找到其他解决方案来解析这种类型的文件,请为我提供输入。以下是 .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 中创建解析器的 API,类似于“PegJS”,但是我也无法弄清楚需要为我的文件类型编写的语法如果它将支持文件类型。解析后的结构可能类似于,

{
    "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": []
                }
            ]
        }
    ]
}

【问题讨论】:

  • JSON 是一种定义明确的格式(检查MDN doc),我不确定此类文件是否存在 JS 解析器。你有其他语言的示例实现吗?请收集更多详细信息并edit您的问题。
  • 我在节点中找到了一个名为“Jison”的包,它是一个用于在 JavaScript 中创建解析器的 API,类似于“PegJS”,但是我无法弄清楚需要为我的如果它支持文件类型,文件类型也是如此。
  • 如果您想涵盖一个库及其边缘情况,编写自己的解析器可能是一项艰巨的任务。也许提供一些指向资源文件文档的链接。
  • 您希望它如何用 JSON 表示?
  • @FelixMosheev,嗨,我更新了问题。

标签: javascript json pegjs


【解决方案1】:

以下语法可用于将资源描述文件解析为 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"}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2020-05-07
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多