diff --git a/.completion b/.completion index 7a701c8907..441a6d51cc 100644 --- a/.completion +++ b/.completion @@ -18,7 +18,7 @@ _esmeta_completions() { compileOpt="-compile:log -compile:log-with-loc -compile:opt" buildcfgOpt="-build-cfg:log -build-cfg:dot -build-cfg:pdf" tycheckOpt="-tycheck:target -tycheck:repl -tycheck:repl-continue -tycheck:ignore -tycheck:update-ignore -tycheck:log -tycheck:detail-log -tycheck:type-sens -tycheck:infer-guard" - parseOpt="-parse:debug" + parseOpt="-parse:debug -parse:goal" evalOpt="-eval:timeout -eval:multiple -eval:tycheck -eval:log -eval:detail-log" webOpt="-web:host -web:port" test262testOpt="-test262-test:target -test262-test:features -test262-test:tycheck -test262-test:progress -test262-test:coverage -test262-test:k-fs -test262-test:cp -test262-test:all-tests -test262-test:timeout -test262-test:with-yet -test262-test:log -test262-test:detail-log -test262-test:concurrent" diff --git a/src/main/scala/esmeta/Command.scala b/src/main/scala/esmeta/Command.scala index 906a87bc2e..3177aeec6f 100644 --- a/src/main/scala/esmeta/Command.scala +++ b/src/main/scala/esmeta/Command.scala @@ -121,6 +121,7 @@ case object CmdParse extends Command("parse", CmdExtract >> Parse) { "esmeta parse a.js # parse a.js file.", "esmeta parse a.js -extract:target=es2025 # parse with es2025 spec.", "esmeta parse a.js -parse:debug # parse in the debugging mode.", + "esmeta parse a.js -parse:goal=Module # parse as an ECMAScript module.", ) override val targetName = "+" } diff --git a/src/main/scala/esmeta/cfg/CFG.scala b/src/main/scala/esmeta/cfg/CFG.scala index 762f7343ae..922027bfaf 100644 --- a/src/main/scala/esmeta/cfg/CFG.scala +++ b/src/main/scala/esmeta/cfg/CFG.scala @@ -36,6 +36,7 @@ case class CFG( /** an ECMAScript parser */ lazy val esParser: ESParser = program.esParser lazy val scriptParser: AstFrom = esParser("Script") + lazy val moduleParser: AstFrom = esParser("Module") /** initializer for initial states */ lazy val init: Initialize = new Initialize(this) diff --git a/src/main/scala/esmeta/phase/Parse.scala b/src/main/scala/esmeta/phase/Parse.scala index 0fdc12bd84..e29873a43e 100644 --- a/src/main/scala/esmeta/phase/Parse.scala +++ b/src/main/scala/esmeta/phase/Parse.scala @@ -17,7 +17,7 @@ case object Parse extends Phase[Spec, Ast] { config: Config, ): Ast = val filename = getFirstFilename(cmdConfig, name) - ESParser(spec.grammar, config.debug)("Script").fromFile(filename) + ESParser(spec.grammar, config.debug)(config.goal).fromFile(filename) def defaultConfig: Config = Config() val options: List[PhaseOption[Config]] = List( ( @@ -25,8 +25,14 @@ case object Parse extends Phase[Spec, Ast] { BoolOption(_.debug = _), "turn on debugging mode.", ), + ( + "goal", + StrOption(_.goal = _), + "parsing goal: Script or Module (default: Script).", + ), ) case class Config( var debug: Boolean = false, + var goal: String = "Script", ) } diff --git a/src/main/scala/esmeta/spec/Spec.scala b/src/main/scala/esmeta/spec/Spec.scala index 9443112943..4d82ff9322 100644 --- a/src/main/scala/esmeta/spec/Spec.scala +++ b/src/main/scala/esmeta/spec/Spec.scala @@ -28,6 +28,7 @@ case class Spec( /** ECMAScript parser */ lazy val esParser: ESParser = ESParser(grammar) lazy val scriptParser: AstFrom = esParser("Script") + lazy val moduleParser: AstFrom = esParser("Module") /** get incomplete algorithms */ lazy val incompleteAlgorithms: List[Algorithm] =