我开始使用优秀的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 规则已成功应用?
我做错了什么?
谢谢!
P.S。我是JavaScript的新手,所以请耐心等待我的愚蠢错误:)
答案 0 :(得分:1)
根据我记得的使用PEG.js,启动规则通常用于返回您想要返回的任何内容作为解析器输出:
Start = Statement* { return SystemVariablesDict }
哪个应该以{{1}}结尾。