You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by se...@apache.org on 2022/08/25 10:28:43 UTC
[incubator-nlpcraft] 02/11: IDL fragments related fixes.
This is an automated email from the ASF dual-hosted git repository.
sergeykamov pushed a commit to branch NLPCRAFT-500
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git
commit ce166aa7d8e2abdaa1abfe422bdb0154c0f2e673
Author: Sergey Kamov <sk...@gmail.com>
AuthorDate: Thu Aug 25 11:03:13 2022 +0300
IDL fragments related fixes.
---
.../internal/intent/compiler/NCIDLCompiler.scala | 65 ++++++----------------
1 file changed, 16 insertions(+), 49 deletions(-)
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompiler.scala
index 36cbca7b..1385dcf4 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompiler.scala
@@ -32,54 +32,21 @@ import java.io.*
import java.net.*
import java.util.Optional
import java.util.regex.*
-import scala.collection.concurrent.TrieMap
import scala.collection.mutable
-import scala.jdk.CollectionConverters.*
-class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collection.mutable.Cloneable[NCIDLCompiler]:
+class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with mutable.Cloneable[NCIDLCompiler]:
private val intents = mutable.HashMap.empty[String, Set[NCIDLIntent]]
// Compiler caches.
private val fragCache = mutable.HashMap.empty[String, NCIDLFragment]
private val importCache = mutable.HashSet.empty[String]
- /**
- *
- * @param fragId
- * @return
- */
- private def getFragment(fragId: String): Option[NCIDLFragment] = fragCache.get(fragId)
-
- /**
- *
- * @param fragId
- * @return
- */
- private def hasFragment(fragId: String): Boolean = fragCache.contains(fragId)
-
- /**
- *
- * @param mdlId
- * @param frag
- */
- private def addFragment(mdlId: String, frag: NCIDLFragment): Unit = fragCache += frag.id -> frag
-
- private def addImport(imp: String): Unit = importCache += imp
-
- /**
- *
- * @param imp
- * @return
- */
- private def hasImport(imp: String): Boolean = importCache.contains(imp)
-
/**
*
* @param origin
* @param idl
- * @param mdlCfg
*/
- class FiniteStateMachine(origin: String, idl: String, mdlCfg: NCModelConfig) extends NCIDLBaseListener with NCIDLCodeGenerator:
+ class FiniteStateMachine(origin: String, idl: String) extends NCIDLBaseListener with NCIDLCodeGenerator:
// Actual value for '*' as in min/max shortcut.
final private val MINMAX_MAX = 100
@@ -215,12 +182,12 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
override def exitFragId(ctx: IDP.FragIdContext): Unit =
fragId = ctx.id().getText
- if hasFragment(fragId) then SE(s"Duplicate fragment ID: $fragId")(ctx.id())
+ if fragCache.contains(fragId) then SE(s"Duplicate fragment ID: $fragId")(ctx.id())
override def exitFragRef(ctx: IDP.FragRefContext): Unit =
val id = ctx.id().getText
- getFragment(id) match
+ fragCache.get(id) match
case Some(frag) =>
val meta = if fragMeta == null then Map.empty[String, Any] else fragMeta
for (fragTerm <- frag.terms)
@@ -290,7 +257,8 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
}
override def exitFrag(ctx: IDP.FragContext): Unit =
- addFragment(mdlCfg.getId, NCIDLFragment(fragId, terms.toList))
+ val frag = NCIDLFragment(fragId, terms.toList)
+ fragCache += frag.id -> frag
terms.clear()
fragId = null
@@ -324,9 +292,9 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
override def exitImprt(ctx: IDP.ImprtContext): Unit =
val x = NCUtils.trimQuotes(ctx.qstring().getText)
- if hasImport(x) then logger.warn(s"Ignoring already processed IDL import '$x' in: $origin")
+ if importCache.contains(x) then logger.warn(s"Ignoring already processed IDL import '$x' in: $origin")
else
- addImport(x)
+ importCache += x
var imports: Set[NCIDLIntent] = null
val file = new File(x)
@@ -338,7 +306,7 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
// Second, try as a classloader resource.
if imports == null then
- val in = mdlCfg.getClass.getClassLoader.getResourceAsStream(x)
+ val in = cfg.getClass.getClassLoader.getResourceAsStream(x)
if (in != null)
val idl = NCUtils.readStream(in).mkString("\n")
imports = compile(idl, x)
@@ -354,10 +322,10 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
imports.foreach(addIntent(_)(ctx.qstring()))
override def syntaxError(errMsg: String, srcName: String, line: Int, pos: Int): NCException =
- throw new NCException(mkSyntaxError(errMsg, srcName, line, pos, idl, origin, mdlCfg))
+ throw new NCException(mkSyntaxError(errMsg, srcName, line, pos, idl, origin, cfg))
override def runtimeError(errMsg: String, srcName: String, line: Int, pos: Int, cause: Exception = null): NCException =
- throw new NCException(mkRuntimeError(errMsg, srcName, line, pos, idl, origin, mdlCfg), cause)
+ throw new NCException(mkRuntimeError(errMsg, srcName, line, pos, idl, origin, cfg), cause)
/**
*
@@ -480,7 +448,7 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
val idlNorm = idl.strip()
intents.getOrElseUpdate(idlNorm, {
- val (fsm, parser) = antlr4Armature(idlNorm, cfg, srcName)
+ val (fsm, parser) = antlr4Armature(idlNorm, srcName)
// Parse the input IDL and walk built AST.
(new ParseTreeWalker).walk(fsm, parser.idl())
@@ -492,22 +460,21 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
/**
*
* @param idl
- * @param mdlCfg
* @param origin
* @return
*/
- private def antlr4Armature(idl: String, mdlCfg: NCModelConfig, origin: String): (FiniteStateMachine, IDP) =
+ private def antlr4Armature(idl: String, origin: String): (FiniteStateMachine, IDP) =
val lexer = new NCIDLLexer(CharStreams.fromString(idl, origin))
val parser = new IDP(new CommonTokenStream(lexer))
// Set custom error handlers.
lexer.removeErrorListeners()
parser.removeErrorListeners()
- lexer.addErrorListener(new CompilerErrorListener(idl, mdlCfg, origin))
- parser.addErrorListener(new CompilerErrorListener(idl, mdlCfg, origin))
+ lexer.addErrorListener(new CompilerErrorListener(idl, cfg, origin))
+ parser.addErrorListener(new CompilerErrorListener(idl, cfg, origin))
// State automata + it's parser.
- new FiniteStateMachine(origin, idl, mdlCfg) -> parser
+ new FiniteStateMachine(origin, idl) -> parser
/**
* Compiles inline (supplied) fragments and/or intents. Note that fragments are accumulated in a static