Sunday 21 May 2017

How to export state variable from PEG.js parser

I'm starting to use excellent PEG.JS JavaScript parser generator
to implement Qt's qmake project file parser (*.pro).
It looks bash script, with variable assignments and function calls.
First of all, i need to parse all assignments to some kind of Dictionary, and use it in external code.

I can't undestand how to access internal parser state from the external function. I.e.: i need to parse my pro-file, and save state into client code-accessible variable, e.g. JavaScript Dictionary. But i can't achieve this!

Grammar (right now understood only assignment statement like 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):

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?
What am i doing wrong?

Thanks!

P.S. I'm new to JavaScript, so be patient to my silly mistakes please :)



via eraxillan

No comments:

Post a Comment