Files
Viper_VRTE/ast/__init__.vp
T
TermiNexus b85f49ab35 feat(ast): 新增 fallthrough 软关键字语句节点 FallThrough
- base.vp:ASTKind 末尾追加 FallThrough(append 保持既有枚举值不变)
- stmts.vp:FallThrough 语句节点(kind / type_name / dump)
- parser.vp:语句位置识别裸 `fallthrough`(仅整条语句命中;fallthrough = 1 /
  fallthrough(x) / d.fallthrough 等作标识符的写法不受影响)
- __init__.vp:导出 FallThrough
2026-10-02 22:33:15 +08:00

115 lines
4.1 KiB
Plaintext

import t, c
from stdint import *
import memhub
import string
# Import submodule
from .tokens import (
Token, TokenType, Keyword, TokOp, _init_tables,
)
# Common Section: Base Classes, Enums, Constants, Helper Functions, Dump
from .base import (
AST, Stmt, ExprNode, ASTKind, ASTCtx, OpKind, ASTFlag,
# Constants
CONST_INT, CONST_FLOAT, CONST_STR, CONST_BOOL, CONST_NONE, CONST_CHAR,
FLAG_IS_ASYNC, FLAG_SIMPLE, FLAG_HAS_STAR,
# Helper Functions
_init_ast, _copy_str, _set_pos, _inherit_pos, _set_parent_list,
_binop_from_op, _augop_from_op, _cmpop_from_op,
_emit, _emit_str, _emit_int, _dump_list,
dump, _op_name,
)
# Statement Nodes: Module, Expression, Interactive, FunctionType
from .stmts import (
# Module Layer
Module, Expression, Interactive, FunctionType,
# Statement
FunctionDef, ClassDef, Return, Delete, Assign, AugAssign, AnnAssign,
For, While, If, With, Raise, Try, Assert, Global, Nonlocal,
Pass, Break, Continue, FallThrough, Expr, Import, ImportFrom, Match,
)
# Expression Nodes: BoolOp, BinOp, UnaryOp, Lambda, IfExp, Dict, Set
from .exprs import (
# Expression Layer
BoolOp, BinOp, UnaryOp, Lambda, IfExp, Dict, Set,
ListComp, SetComp, DictComp, GeneratorExp,
Await, Yield, YieldFrom, FormattedValue, JoinedStr,
Constant, NamedExpr, Attribute, Subscript, Starred, Name,
List, Tuple, Slice,
Call, Compare, OpNode,
name_get_id, constant_get_str_val,
binop_get_left, binop_get_right,
attribute_get_attr, attribute_get_value,
)
# Auxiliary Nodes
from .astaux import (
ExceptHandler, Arguments, Arg, Keyword, Alias, WithItem,
Comprehension,
)
# Pattern Matching
from .match import (
MatchCase, MatchValue, MatchSingleton, MatchSequence,
MatchMapping, MatchClass, MatchStar, MatchAs, MatchOr,
)
# from .visitor import ASTVisitor
from .lexer import Lexer, _lexer_init, tokenize, new_lexer
from .parser import Parser, _parser_init, parse_tokens, new_parser
from .parser import _parse_test
from .parser import _dbg_lookup_lit_val, _dbg_lit_found
from .parser import get_parse_err_line, get_parse_err_col, get_parse_err_msg
# ============================================================
# Global Memory Pool Pointer (follows project rules: declare _mbuddy)
# User initializes in main: ast._mbuddy = memhub.MemBuddy(arena, size)
# ============================================================
_mbuddy: memhub.MemBuddy*
# ============================================================
# Common API: parse
# ============================================================
def parse(src: str, pool: rawptr[memhub.MemManager]) -> rawptr[AST]:
"""Parse Python source code, return the AST Module node.
Parameters:
src: NUL source code string, terminated with NUL
pool: memhub.MemManager instance, to allocate AST nodes
Returns:
AST Module node, or None
"""
if src is None or pool is None: return None
_init_tables(pool)
lx: rawptr[Lexer] = new_lexer(pool)
if lx is None: return None
_lexer_init(lx, src, pool)
tokens: rawptr[Token] = tokenize(lx)
if tokens is None: return None
tree: rawptr[AST] = parse_tokens(pool, tokens)
return tree
def parse_expression(src: str, pool: rawptr[memhub.MemManager]) -> rawptr[Expression]:
"""Parse a single expression, return the Expression node.
Parameters:
src: NUL expression string, terminated with NUL
pool: memhub.MemManager instance, to allocate AST nodes
Returns:
Expression node (包装节点,body 字段为实际表达式), or None
"""
if src is None or pool is None: return None
_init_tables(pool)
lx: rawptr[Lexer] = new_lexer(pool)
if lx is None: return None
_lexer_init(lx, src, pool)
tokens: rawptr[Token] = tokenize(lx)
if tokens is None: return None
ps: rawptr[Parser] = new_parser(pool)
if ps is None: return None
_parser_init(ps, tokens, pool)
body: rawptr[AST] = _parse_test(ps)
return Expression(pool, body)