simc-ast-builder
Version:
Parser and AST generator for SimulationCraft files
55 lines • 2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Parser = void 0;
const antlr4ts_1 = require("antlr4ts");
const types_1 = require("../types");
const ConditionOptimizer_1 = require("../utils/ConditionOptimizer");
const SimCExprLexer_1 = require("./antlr4/SimCExprLexer");
const SimCExprParser_1 = require("./antlr4/SimCExprParser");
const SimCGenericVisitor_1 = require("./visitors/ast/SimCGenericVisitor");
/**
* Main parser class for SimC files
*/
class Parser {
/**
* Create a new Parser instance
* @param optimizerOptions Options for the condition optimizer
*/
constructor(optimizerOptions = types_1.DEFAULT_OPTIMIZER_OPTIONS) {
this.optimizer = new ConditionOptimizer_1.ConditionOptimizer(optimizerOptions);
}
/**
* Parse a SimC string and return the AST
*
* @param input - The SimC code to parse
* @returns The parsed AST node
*/
parse(input) {
// Set up the lexer and parser
const charStream = antlr4ts_1.CharStreams.fromString(input.trim());
const lexer = new SimCExprLexer_1.SimCExprLexer(charStream);
const tokenStream = new antlr4ts_1.CommonTokenStream(lexer);
const parser = new SimCExprParser_1.SimCExprParser(tokenStream);
// Parse the input
const parseTree = parser.parse();
// Visit the parse tree to generate AST
const visitor = new SimCGenericVisitor_1.SimCGenericVisitor();
return visitor.visit(parseTree);
}
/**
* Parse a SimC string and optimize the resulting AST
*
* @param input - The SimC code to parse
* @returns The optimized AST node
*/
parseAndOptimize(input) {
const ast = this.parse(input);
// Apply optimizations if this is an expression node
if (ast.kind === "expression") {
return this.optimizer.optimize(ast);
}
return ast;
}
}
exports.Parser = Parser;
//# sourceMappingURL=Parser.js.map