Skip to content

A fast and reliable Lua 5.3 parser that converts Lua code to Abstract Syntax Tree (AST) and regenerates code from AST

License

Notifications You must be signed in to change notification settings

OxenFxc/lua-ast-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

7 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿš€ LuaAstParser

GitHub stars GitHub forks License: MIT Lua Version

๐ŸŒŸ ็บฏLuaๅฎž็Žฐ็š„AST่งฃๆžๅ™จ | ๐Ÿค– ๆ”ฏๆŒ่ฏญๆณ•ๆ‰ฉๅฑ• | ๐Ÿ“– ไธญ่‹ฑๆ–‡ๆ–‡ๆกฃ

English | ไธญๆ–‡ | ๐Ÿ“– ๆ–‡ๆกฃ | ๐ŸŽฎ ๅฟซ้€Ÿๅผ€ๅง‹


ไธญๆ–‡

ไธ€ไธช็”จ็บฏ Lua ๅฎž็Žฐ็š„ๅฎŒๆ•ด Lua ่งฃๆžๅ™จ๏ผŒๆ”ฏๆŒไปŽ Lua ๆบ็ ๅˆฐ AST ็š„่ฝฌๆขใ€AST ๅˆฐ Lua ๆบ็ ็š„ๆ‰“ๅฐ๏ผŒไปฅๅŠ AST ็š„่งฃ้‡Šๆ‰ง่กŒใ€‚

โœจ ๅŠŸ่ƒฝ็‰นๆ€ง

  • ๐ŸŽฏ ๅฎŒๆ•ด็š„่ฏๆณ•ๅˆ†ๆžๅ™จ๏ผšๆ”ฏๆŒๆ‰€ๆœ‰ Lua ๆ ‡่ฎฐ็ฑปๅž‹๏ผŒๅŒ…ๆ‹ฌๅ…ณ้”ฎๅญ—ใ€ๆ ‡่ฏ†็ฌฆใ€ๅญ—้ข้‡็ญ‰
  • ๐Ÿ” ้€’ๅฝ’ไธ‹้™่ฏญๆณ•ๅˆ†ๆžๅ™จ๏ผšๅฎž็ŽฐๅฎŒๆ•ด็š„ Lua ่ฏญๆณ•่งฃๆž๏ผŒๆ”ฏๆŒ่กจ่พพๅผๅ’Œ่ฏญๅฅ
  • ๐ŸŒณ AST ๆž„ๅปบ๏ผšๆž„ๅปบ็ป“ๆž„ๅŒ–็š„ๆŠฝ่ฑก่ฏญๆณ•ๆ ‘๏ผŒๆ”ฏๆŒ่ฎฟ้—ฎ่€…ๆจกๅผ
  • ๐Ÿ–จ๏ธ ไปฃ็ ๆ‰“ๅฐๅ™จ๏ผšๅฐ† AST ่ฝฌๆขไธบๆ ผๅผๅŒ–็š„ Lua ๆบ็ 
  • โšก AST ่งฃ้‡Šๅ™จ๏ผš็บฏ Lua ๅฎž็Žฐ็š„ AST ๆ‰ง่กŒๅผ•ๆ“Ž๏ผŒๆ”ฏๆŒๅคง้ƒจๅˆ† Lua ็‰นๆ€ง
  • ๐Ÿ”Œ ๆ’ไปถ็ณป็ปŸ๏ผšๅฏๆ‰ฉๅฑ•็š„ๆ’ไปถๆžถๆž„๏ผŒๆ”ฏๆŒ่‡ชๅฎšไน‰่ฏญๆณ•ๅ’ŒๅŠŸ่ƒฝ
  • ๐Ÿฉบ ่ฏŠๆ–ญ็ณป็ปŸ๏ผšๅฎŒๆ•ด็š„้”™่ฏฏ่ฏŠๆ–ญๅ’Œไฝ็ฝฎ่ฟฝ่ธช
  • ๐Ÿงฐ ๅทฅๅ…ทๅบ“๏ผšไธฐๅฏŒ็š„ๅญ—็ฌฆไธฒใ€่กจๆ ผใ€ไฝ็ฝฎๅค„็†ๅทฅๅ…ท

๐ŸŽฎ ็‰น่‰ฒๅŠŸ่ƒฝ

  • ๐Ÿ”ฅ ้›ถไพ่ต–๏ผš็บฏLuaๅฎž็Žฐ๏ผŒๆ— ้œ€ๅค–้ƒจไพ่ต–
  • ๐Ÿš€ ้ซ˜ๆ€ง่ƒฝ๏ผšไผ˜ๅŒ–็š„่งฃๆž็ฎ—ๆณ•๏ผŒๆ”ฏๆŒๅคงๅž‹ไปฃ็ ๆ–‡ไปถ
  • ๐ŸŽจ ๆ˜“ๆ‰ฉๅฑ•๏ผšๆ’ไปถ็ณป็ปŸ่ฎฉๅฎšๅˆถๅ˜ๅพ—็ฎ€ๅ•ๆœ‰่ถฃ
  • ๐Ÿ“ฑ ่ทจๅนณๅฐ๏ผšๆ”ฏๆŒๆ‰€ๆœ‰Lua่ฟ่กŒ็Žฏๅขƒ

้กน็›ฎ็ป“ๆž„

lua/
โ”œโ”€โ”€ ast/              # ๆŠฝ่ฑก่ฏญๆณ•ๆ ‘ๆจกๅ—
โ”‚   โ”œโ”€โ”€ init.lua      # AST ไธปๅ…ฅๅฃๅ’ŒๅทฅๅŽ‚
โ”‚   โ”œโ”€โ”€ nodes.lua     # AST ่Š‚็‚นๅฎšไน‰
โ”‚   โ””โ”€โ”€ visitor.lua   # ่ฎฟ้—ฎ่€…ๆจกๅผๅฎž็Žฐ
โ”œโ”€โ”€ interpreter/      # AST ่งฃ้‡Šๅ™จ
โ”‚   โ”œโ”€โ”€ init.lua      # ่งฃ้‡Šๅ™จไธปๅ…ฅๅฃ
โ”‚   โ””โ”€โ”€ builtins.lua  # ๅ†…็ฝฎๅ‡ฝๆ•ฐๅฎž็Žฐ
โ”œโ”€โ”€ lexer/            # ่ฏๆณ•ๅˆ†ๆžๅ™จ
โ”‚   โ”œโ”€โ”€ init.lua      # ่ฏๆณ•ๅ™จไธปๅ…ฅๅฃ
โ”‚   โ”œโ”€โ”€ scanner.lua   # ๆ‰ซๆๅ™จๅฎž็Žฐ
โ”‚   โ”œโ”€โ”€ token.lua     # Token ๅฎšไน‰
โ”‚   โ””โ”€โ”€ keywords.lua  # ๅ…ณ้”ฎๅญ—ๅฎšไน‰
โ”œโ”€โ”€ parser/           # ่ฏญๆณ•ๅˆ†ๆžๅ™จ
โ”‚   โ”œโ”€โ”€ init.lua      # ่ฏญๆณ•ๅ™จไธปๅ…ฅๅฃ
โ”‚   โ”œโ”€โ”€ expressions.lua # ่กจ่พพๅผ่งฃๆž
โ”‚   โ”œโ”€โ”€ statements.lua  # ่ฏญๅฅ่งฃๆž
โ”‚   โ””โ”€โ”€ precedence.lua   # ่ฟ็ฎ—็ฌฆไผ˜ๅ…ˆ็บง
โ”œโ”€โ”€ printer/          # ไปฃ็ ๆ‰“ๅฐๅ™จ
โ”‚   โ”œโ”€โ”€ init.lua      # ๆ‰“ๅฐๅ™จไธปๅ…ฅๅฃ
โ”‚   โ”œโ”€โ”€ emitter.lua   # ไปฃ็ ๅ‘ๅฐ„ๅ™จ
โ”‚   โ””โ”€โ”€ formatter.lua # ๆ ผๅผๅŒ–ๅ™จ
โ”œโ”€โ”€ plugins/          # ๆ’ไปถ็ณป็ปŸ
โ”‚   โ””โ”€โ”€ example_plugins.lua # ็คบไพ‹ๆ’ไปถ
โ”œโ”€โ”€ utils/            # ๅทฅๅ…ทๅบ“
โ”‚   โ”œโ”€โ”€ diagnostics.lua # ่ฏŠๆ–ญ็ณป็ปŸ
โ”‚   โ”œโ”€โ”€ position.lua    # ไฝ็ฝฎๅค„็†
โ”‚   โ”œโ”€โ”€ string_ext.lua  # ๅญ—็ฌฆไธฒๆ‰ฉๅฑ•
โ”‚   โ””โ”€โ”€ table_ext.lua   # ่กจๆ ผๆ‰ฉๅฑ•
โ”œโ”€โ”€ init.lua          # ไธปๅ…ฅๅฃ
โ””โ”€โ”€ plugins.lua       # ๆ’ไปถ็ฎก็†ๅ™จ

๐ŸŽฎ ๅฟซ้€Ÿๅผ€ๅง‹

๐Ÿš€ ๅŸบๆœฌไฝฟ็”จ

local luaparser = require("lua")

-- ๐Ÿ“ ่งฃๆž Lua ๆบ็ ไธบ AST
local success, result = luaparser.parse_lua("print('Hello, World!')")
if success then
    local ast = result
    print("โœจ ่งฃๆžๆˆๅŠŸ")
end

-- ๐Ÿ–จ๏ธ ๅฐ† AST ่ฝฌๆขไธบ Lua ๆบ็ 
local success, result = luaparser.print_lua(ast)
if success then
    local code = result.code
    print(code)  -- ่พ“ๅ‡บ: print('Hello, World!')
end

-- โšก ่งฃ้‡Šๆ‰ง่กŒ AST
local success, result = luaparser.interpret_lua(ast)
if success then
    print("๐ŸŽฏ ๆ‰ง่กŒ็ป“ๆžœ:", result)
end

๐Ÿ”Œ ๆ’ไปถ็ณป็ปŸ

-- ๐ŸŽจ ๆณจๅ†Œ่‡ชๅฎšไน‰ๆ’ไปถ
local my_plugin = {
    name = "my_plugin",
    version = "1.0.0",
    description = "My custom plugin",

    init = function(config)
        print("๐Ÿš€ Plugin initialized")
    end,

    extend_lexer = function(lexer)
        -- ๐Ÿ”ค ๆ‰ฉๅฑ•่ฏๆณ•ๅ™จ
    end,

    extend_parser = function(parser)
        -- ๐Ÿ“Š ๆ‰ฉๅฑ•่ฏญๆณ•ๅ™จ
    end
}

luaparser.register_plugin(my_plugin)
luaparser.load_plugin("my_plugin")

๐ŸŽช ่ถฃๅ‘ณ็คบไพ‹

-- ๐ŸŒŸ ่งฃๆžๅนถๆ‰ง่กŒไธ€ไธชๆœ‰่ถฃ็š„่กจ่พพๅผ
local code = [[
    local result = {}
    for i = 1, 10 do
        result[i] = i * i
    end
    return result
]]

local success, ast = luaparser.parse_lua(code)
if success then
    local success, result = luaparser.interpret_lua(ast)
    if success then
        print("๐ŸŽฒ ่ฎก็ฎ—็ป“ๆžœ:", table.concat(result, ", "))
    end
end

๐Ÿ“š API ๆ–‡ๆกฃ

โš™๏ธ ๆ ธๅฟƒๅ‡ฝๆ•ฐ

  • ๐Ÿ“ parse_lua(source, options) - ่งฃๆž Lua ๆบ็ ไธบ AST
  • ๐Ÿ–จ๏ธ print_lua(ast, options) - ๅฐ† AST ่ฝฌๆขไธบ Lua ๆบ็ 
  • โšก interpret_lua(ast, options) - ่งฃ้‡Šๆ‰ง่กŒ AST

๐Ÿ”ง ้ซ˜็บงๅ‡ฝๆ•ฐ

  • ๐Ÿ—๏ธ create_parser(config) - ๅˆ›ๅปบๆ–ฐ็š„่งฃๆžๅ™จๅฎžไพ‹
  • ๐Ÿ“Š create_plugin_manager() - ๅˆ›ๅปบๆ’ไปถ็ฎก็†ๅ™จ

๐Ÿ”Œ ๆ’ไปถ API

  • โž• register_plugin(plugin) - ๆณจๅ†Œๆ’ไปถ
  • ๐Ÿ“ฅ load_plugin(name, config) - ๅŠ ่ฝฝๆ’ไปถ
  • ๐Ÿ“ค unload_plugin(name) - ๅธ่ฝฝๆ’ไปถ
  • ๐Ÿ” get_plugin(name) - ่Žทๅ–ๆ’ไปถๅฎžไพ‹
  • ๐Ÿ“‹ get_registered_plugins() - ่Žทๅ–ๅทฒๆณจๅ†Œๆ’ไปถๅˆ—่กจ

๐Ÿค ่ดก็Œฎ

ๆฌข่ฟŽ่ดก็Œฎไปฃ็ ๏ผ่ฏทๆŸฅ็œ‹ๆˆ‘ไปฌ็š„่ดก็ŒฎๆŒ‡ๅ—๏ผš

๐Ÿ“ž ่”็ณปๆˆ‘ไปฌ

๐Ÿ“„ ่ฎธๅฏ่ฏ

ๆœฌ้กน็›ฎ้‡‡็”จ MIT ่ฎธๅฏ่ฏ - ่ฏฆ่ง LICENSE ๆ–‡ไปถ


๐ŸŒŸ ๅฆ‚ๆžœ่ฟ™ไธช้กน็›ฎๅฏนไฝ ๆœ‰ๅธฎๅŠฉ๏ผŒ่ฏท็ป™ๅฎƒไธ€ไธช โญ Star๏ผ

Star History Chart


English

A complete Lua parser implemented in pure Lua, supporting conversion from Lua source code to AST, AST to Lua source code printing, and AST interpretation execution.

โœจ Features

  • ๐ŸŽฏ Complete Lexer: Supports all Lua token types, including keywords, identifiers, literals, etc.
  • ๐Ÿ” Recursive Descent Parser: Implements complete Lua syntax parsing, supporting expressions and statements
  • ๐ŸŒณ AST Construction: Builds structured abstract syntax trees, supports visitor pattern
  • ๐Ÿ–จ๏ธ Code Printer: Converts AST to formatted Lua source code
  • โšก AST Interpreter: Pure Lua implementation of AST execution engine, supports most Lua features
  • ๐Ÿ”Œ Plugin System: Extensible plugin architecture, supports custom syntax and functionality
  • ๐Ÿฉบ Diagnostics System: Complete error diagnostics and position tracking
  • ๐Ÿงฐ Utility Library: Rich string, table, and position handling utilities

๐ŸŽฎ Special Features

  • ๐Ÿ”ฅ Zero Dependencies: Pure Lua implementation, no external dependencies required
  • ๐Ÿš€ High Performance: Optimized parsing algorithms, supports large code files
  • ๐ŸŽจ Easy to Extend: Plugin system makes customization simple and fun
  • ๐Ÿ“ฑ Cross-platform: Supports all Lua runtime environments

Project Structure

lua/
โ”œโ”€โ”€ ast/              # Abstract Syntax Tree module
โ”‚   โ”œโ”€โ”€ init.lua      # AST main entry and factory
โ”‚   โ”œโ”€โ”€ nodes.lua     # AST node definitions
โ”‚   โ””โ”€โ”€ visitor.lua   # Visitor pattern implementation
โ”œโ”€โ”€ interpreter/      # AST Interpreter
โ”‚   โ”œโ”€โ”€ init.lua      # Interpreter main entry
โ”‚   โ””โ”€โ”€ builtins.lua  # Built-in functions implementation
โ”œโ”€โ”€ lexer/            # Lexical Analyzer
โ”‚   โ”œโ”€โ”€ init.lua      # Lexer main entry
โ”‚   โ”œโ”€โ”€ scanner.lua   # Scanner implementation
โ”‚   โ”œโ”€โ”€ token.lua     # Token definitions
โ”‚   โ””โ”€โ”€ keywords.lua  # Keywords definitions
โ”œโ”€โ”€ parser/           # Syntax Parser
โ”‚   โ”œโ”€โ”€ init.lua      # Parser main entry
โ”‚   โ”œโ”€โ”€ expressions.lua # Expression parsing
โ”‚   โ”œโ”€โ”€ statements.lua  # Statement parsing
โ”‚   โ””โ”€โ”€ precedence.lua   # Operator precedence
โ”œโ”€โ”€ printer/          # Code Printer
โ”‚   โ”œโ”€โ”€ init.lua      # Printer main entry
โ”‚   โ”œโ”€โ”€ emitter.lua   # Code emitter
โ”‚   โ””โ”€โ”€ formatter.lua # Formatter
โ”œโ”€โ”€ plugins/          # Plugin System
โ”‚   โ””โ”€โ”€ example_plugins.lua # Example plugins
โ”œโ”€โ”€ utils/            # Utility Library
โ”‚   โ”œโ”€โ”€ diagnostics.lua # Diagnostics system
โ”‚   โ”œโ”€โ”€ position.lua    # Position handling
โ”‚   โ”œโ”€โ”€ string_ext.lua  # String extensions
โ”‚   โ””โ”€โ”€ table_ext.lua   # Table extensions
โ”œโ”€โ”€ init.lua          # Main entry
โ””โ”€โ”€ plugins.lua       # Plugin manager

Quick Start

๐Ÿš€ Basic Usage

local luaparser = require("lua")

-- ๐Ÿ“ Parse Lua source code to AST
local success, result = luaparser.parse_lua("print('Hello, World!')")
if success then
    local ast = result
    print("โœจ Parse successful")
end

-- ๐Ÿ–จ๏ธ Convert AST to Lua source code
local success, result = luaparser.print_lua(ast)
if success then
    local code = result.code
    print(code)  -- Output: print('Hello, World!')
end

-- โšก Interpret and execute AST
local success, result = luaparser.interpret_lua(ast)
if success then
    print("๐ŸŽฏ Execution result:", result)
end

๐Ÿ”Œ Plugin System

-- ๐ŸŽจ Register custom plugin
local my_plugin = {
    name = "my_plugin",
    version = "1.0.0",
    description = "My custom plugin",

    init = function(config)
        print("๐Ÿš€ Plugin initialized")
    end,

    extend_lexer = function(lexer)
        -- ๐Ÿ”ค Extend lexer
    end,

    extend_parser = function(parser)
        -- ๐Ÿ“Š Extend parser
    end
}

luaparser.register_plugin(my_plugin)
luaparser.load_plugin("my_plugin")

๐ŸŽช Fun Example

-- ๐ŸŒŸ Parse and execute an interesting expression
local code = [[
    local result = {}
    for i = 1, 10 do
        result[i] = i * i
    end
    return result
]]

local success, ast = luaparser.parse_lua(code)
if success then
    local success, result = luaparser.interpret_lua(ast)
    if success then
        print("๐ŸŽฒ Calculation result:", table.concat(result, ", "))
    end
end

๐Ÿ“š API Documentation

โš™๏ธ Core Functions

  • ๐Ÿ“ parse_lua(source, options) - Parse Lua source code to AST
  • ๐Ÿ–จ๏ธ print_lua(ast, options) - Convert AST to Lua source code
  • โšก interpret_lua(ast, options) - Interpret and execute AST

๐Ÿ”ง Advanced Functions

  • ๐Ÿ—๏ธ create_parser(config) - Create new parser instance
  • ๐Ÿ“Š create_plugin_manager() - Create plugin manager

๐Ÿ”Œ Plugin API

  • โž• register_plugin(plugin) - Register plugin
  • ๐Ÿ“ฅ load_plugin(name, config) - Load plugin
  • ๐Ÿ“ค unload_plugin(name) - Unload plugin
  • ๐Ÿ” get_plugin(name) - Get plugin instance
  • ๐Ÿ“‹ get_registered_plugins() - Get registered plugins list

๐Ÿค Contributing

Contributions are welcome! Check out our contribution guidelines:

๐Ÿ“ž Contact Us

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details


๐ŸŒŸ If this project helps you, please give it a โญ Star!

Star History Chart

About

A fast and reliable Lua 5.3 parser that converts Lua code to Abstract Syntax Tree (AST) and regenerates code from AST

Resources

License

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages