【问题标题】:How to export state variable from PEG.js parser如何从 PEG.js 解析器中导出状态变量
【发布时间】:2017-05-22 01:42:51
【问题描述】:

我开始使用优秀的PEG.JS JavaScript 解析器生成器
实现 Qt 的 qmake 项目文件解析器 (*.pro)。
它看起来像 bash 脚本,带有变量赋值和函数调用。
首先,我需要将所有分配解析为某种Dictionary, 并在外部代码中使用它。

我无法理解如何从外部函数访问内部解析器状态。 即:我需要解析我的pro-文件,并将状态保存到客户端代码可访问的变量中,例如JavaScript 字典。 但我做不到!

语法(现在只理解像TEMPLATE = app这样的赋值语句):

{
    var SystemVariablesDict = {};
}

Start = Statement*
Statement = Whitespace GenericAssignmentStatement Whitespace
GenericAssignmentStatement = TemplateAssignmentStatement

// TEMPLATE = app|lib|subdirs|aux|vcapp|vclib
SystemTemplateVariableName = "TEMPLATE"
SystemTemplateVariableValue = "app" / "lib" / "subdirs" / "aux" / "vcapp" / "vclib"
TemplateAssignmentStatement = lvalue:SystemTemplateVariableName 
AssignmentOperator rvalue:SystemTemplateVariableValue
{
    // [REF 1] !!! Assignment to the global state variable !!!
    SystemVariablesDict[lvalue] = rvalue;
    return undefined;
}

AssignmentOperator = Whitespace "=" Whitespace

Word = w:Character+ { return w.join(""); }
Character = c:[a-zA-Z0-9]
Whitespace = [ \t\r\n]*

(上面的语法在qmake-project-parser.js编译成功) 解析器使用代码(frontend.js文件):

var pegjs = require("./qmake-project-parser.js");
var parserOutput = pegjs.parse("TEMPLATE = app");
console.log("PEG.js parser output:");
console.log(parserOutput);
console.log("System variables dict:");
console.log(pegjs.SystemVariablesDict);

还有输出:

C:\Projects\qmake-project-parser>node frontend.js
PEG.js parser output:
[ [ [], undefined, [] ] ]
System variables dict:
**undefined**

问题是:为什么输出了undefined,却成功应用了REF 1规则?
我做错了什么?

谢谢!

附:我是 JavaScript 新手,所以请耐心等待我的愚蠢错误 :)

【问题讨论】:

    标签: javascript node.js parsing peg pegjs


    【解决方案1】:

    根据我对使用 PEG.js 的记忆,开始规则通常用于返回您想要返回的任何内容作为解析器输出:

    Start = Statement* { return SystemVariablesDict }
    

    应该以parserOutput结尾。

    【讨论】:

    • 谢谢!现在解析器本身返回所需的Dictionary。但是使用这种方式我只能使用一个全局状态变量。有没有办法将客户端代码变量“转发”到 PEG.js 内部?
    • 您当然可以导出一个嵌套对象,其中包含您想要从解析器传递给调用代码的所有内容。
    • 好的,接受!我需要更深入地学习 JavaScript 中的类型系统
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2021-03-31
    相关资源
    最近更新 更多