summaryrefslogtreecommitdiff
path: root/server-beta/src/parser/parse.lua
blob: cec946c0294a0774f9d00f99ded916fc99f019ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
local ast = require 'parser.ast'

return function (self, lua, mode, version)
    local errs  = {}
    local state = {
        version = version,
        lua = lua,
        emmy = {},
        root = {},
        pushError = function (err)
            if err.finish < err.start then
                err.finish = err.start
            end
            local last = errs[#errs]
            if last then
                if last.start <= err.start and last.finish >= err.finish then
                    return
                end
            end
            err.level = err.level or 'error'
            errs[#errs+1] = err
            return err
        end,
    }
    ast.init(state)
    local suc, res, err = xpcall(self.grammar, debug.traceback, self, lua, mode)
    ast.close()
    if not suc then
        return nil, res
    end
    if not res then
        state.pushError(err)
        return nil, errs
    end
    state.ast = res
    return state, errs
end