javascript - 如何从 PEG.js 解析器导出状态变量

标签 javascript node.js parsing peg pegjs

我开始使用优秀的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**

问题是:为什么未定义输出,但REF 1规则应用成功?
我做错了什么?

谢谢!

附注我是 JavaScript 新手,所以请对我的愚蠢错误保持耐心:)

最佳答案

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

Start = Statement* { return SystemVariablesDict }

最终应该出现在parserOutput中。

关于javascript - 如何从 PEG.js 解析器导出状态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099788/

相关文章:

javascript - 嵌套循环输出的时间

javascript - IndexedDB 打开数据库请求奇怪的行为

node.js - 导入不起作用 NodeJs 应用程序 React SSR

json - 我想使用python3将 "command>systeminfo"的输出解析为json

java - 如何匹配括号来解析 S 表达式?

Javascript 日期解析错误 - 6 月的日期失败(??)

javascript - 如何延迟某个 block 在 HTML 中变得可见?

javascript - 定位动态添加的视频

javascript - Asp.Net 的 Javascript 中的 Node.js 代码

python - 为 HMAC 准备字符串