简体   繁体   English

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

[英]How to export state variable from PEG.js parser

I'm starting to use excellent PEG.JS JavaScript parser generator 我开始使用出色的PEG.JS JavaScript解析器生成器
to implement Qt's qmake project file parser (*.pro). 实现Qt的qmake项目文件解析器(* .pro)。
It looks bash script, with variable assignments and function calls. 它看起来像bash脚本,具有变量分配和函数调用。
First of all, i need to parse all assignments to some kind of Dictionary , and use it in external code. 首先,我需要解析所有对某种Dictionary赋值,并在外部代码中使用它。

I can't undestand how to access internal parser state from the external function. 我无法理解如何从外部函数访问内部解析器状态。 Ie: i need to parse my pro -file, and save state into client code-accessible variable, eg JavaScript Dictionary. 即:我需要解析我的pro文件,并将状态保存到客户端代码可访问的变量中,例如JavaScript字典。 But i can't achieve this! 但是我做不到!

Grammar (right now understood only assignment statement like TEMPLATE = app ): 语法(目前仅理解诸如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]*

(The grammar above was successfully compiled in the qmake-project-parser.js ) The parser usage code ( frontend.js file): (上面的语法已在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);

And the output: 并输出:

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

The question is: why undefined was outputed, however the REF 1 rule was successfully applied? 问题是:为什么输出undefined ,但是成功应用了REF 1规则?
What am i doing wrong? 我究竟做错了什么?

Thanks! 谢谢!

PS I'm new to JavaScript, so be patient to my silly mistakes please :) PS我是JavaScript的新手,请耐心等待我的愚蠢错误:)

From what I remember from using PEG.js, the start rule is generally used to return whatever you want to return as parser output: 从使用PEG.js所记得的内容中,开始规则通常用于返回要作为解析器输出返回的任何内容:

Start = Statement* { return SystemVariablesDict }

Which should end up in parserOutput . 哪个应该以parserOutput

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM