Antlr v4 线程安全模式

Antlr v4 thread-safe mode

我的代码是这样写的:

  1. 首先我用蚂蚁创建例程池:
var pool, _ = ants.NewPoolWithFunc(5, func(commitDiff interface{}) {
    AnalyzeCommitDiff(commitDiff.(diffParsedType))
})

*函数 AnalyzeCommitDiff() 包含我的 antlr_analysis 函数

  1. 然后我写了这些:
var (
    lexerPool *sync.Pool = &sync.Pool{New: func() interface{} {
        return javaparser.NewJavaLexer(nil)
    }}
    parserPool *sync.Pool = &sync.Pool{New: func() interface{} {
        return javaparser.NewJavaParser(nil)
    }}
    newTreeShapeListener *sync.Pool = &sync.Pool{New: func() interface{} {
        return new(TreeShapeListener)
    }}
)

func executeJava(diffText string) javaparser.AnalysisInfoType {

    input := antlr.NewInputStream(diffText)


    lexer := lexerPool.Get().(*javaparser.JavaLexer)
    defer lexerPool.Put(lexer)
    lexer.SetInputStream(input)

    stream := antlr.NewCommonTokenStream(lexer, 0)

    p := parserPool.Get().(*javaparser.JavaParser)
    defer parserPool.Put(p)
    p.SetTokenStream(stream)

    //p.AddErrorListener(antlr.NewDiagnosticErrorListener(true))

    p.BuildParseTrees = true

    p.GetInterpreter().SetPredictionMode(antlr.PredictionModeSLL)

    tree := p.CompilationUnit()

    listener := newTreeShapeListener.Get().(*TreeShapeListener)
    defer newTreeShapeListener.Put(listener)

    antlr.ParseTreeWalkerDefault.Walk(listener, tree)
    return javaparser.Infos
}

但是由于不是线程安全的,所以显然存在问题。 如何使我的代码线程安全? 谁能给我举个例子吗?

线程池不适用于 ANTLR4。出于性能原因,没有额外的线程处理,除了解析器或词法分析器访问共享 DFA 的一个地方。

因此,您可以使用线程的唯一方法是将一个 lexer/parser 实例关联到一个线程,并仅从该单个线程访问它。每个解析器实例使用一个专用线程,并且从不在线程之间共享 lexers/parser。