import { readFileSync } from "fs"; import { resolve } from "path"; import peggy from "peggy"; import { isDev } from "eez-studio-shared/util-electron"; import { sourceRootDir } from "eez-studio-shared/util"; const expressionParserGrammar = readFileSync( isDev ? resolve(`${sourceRootDir()}/../resources/expression-grammar.pegjs`) : process.resourcesPath! + "/expression-grammar.pegjs", "utf8" ); const peggyParser = peggy.generate(expressionParserGrammar, { cache: true, optimize: "speed" }); const cache = new Map(); export const expressionParser = { parse(expr: string) { let result: any; let resultJSONStr = cache.get(expr); if (resultJSONStr != undefined) { result = JSON.parse(resultJSONStr); } else { result = peggyParser.parse(expr, { grammarSource: expr }); resultJSONStr = JSON.stringify(result); cache.set(expr, resultJSONStr); } return result; } }; export const identifierParser = peggy.generate(expressionParserGrammar, { allowedStartRules: ["Identifier"], cache: true });