zignet
Version:
MCP server for Zig — AI-powered code analysis, validation, and documentation with fine-tuned LLM
1 lines • 46.8 kB
Source Map (JSON)
{"version":3,"file":"parser.cjs","names":["TokenType","token: Token","tokens: Token[]","body: Declaration[]","TokenType","parameters: Parameter[]","typeAnnotation: TypeAnnotation | undefined","initializer: Expression | undefined","statements: Statement[]","value: Expression | undefined","alternate: Statement | undefined","args: Expression[]"],"sources":["../src/lexer.js","../src/parser.ts"],"sourcesContent":["/**\n * ZigNet Lexer\n * Tokenizes Zig source code\n */\n\nconst TokenType = {\n // Keywords\n FN: 'FN',\n CONST: 'CONST',\n VAR: 'VAR',\n STRUCT: 'STRUCT',\n UNION: 'UNION',\n ENUM: 'ENUM',\n IF: 'IF',\n ELSE: 'ELSE',\n WHILE: 'WHILE',\n FOR: 'FOR',\n RETURN: 'RETURN',\n BREAK: 'BREAK',\n CONTINUE: 'CONTINUE',\n COMPTIME: 'COMPTIME',\n INLINE: 'INLINE',\n \n // Types\n I32: 'I32',\n I64: 'I64',\n U32: 'U32',\n F32: 'F32',\n F64: 'F64',\n BOOL: 'BOOL',\n VOID: 'VOID',\n \n // Literals\n NUMBER: 'NUMBER',\n STRING: 'STRING',\n IDENT: 'IDENT',\n TRUE: 'TRUE',\n FALSE: 'FALSE',\n \n // Operators\n PLUS: 'PLUS',\n MINUS: 'MINUS',\n STAR: 'STAR',\n SLASH: 'SLASH',\n PERCENT: 'PERCENT',\n EQ: 'EQ',\n NEQ: 'NEQ',\n LT: 'LT',\n GT: 'GT',\n LTE: 'LTE',\n GTE: 'GTE',\n ASSIGN: 'ASSIGN',\n PLUS_ASSIGN: 'PLUS_ASSIGN',\n AND: 'AND',\n OR: 'OR',\n NOT: 'NOT',\n \n // Punctuation\n LPAREN: 'LPAREN',\n RPAREN: 'RPAREN',\n LBRACE: 'LBRACE',\n RBRACE: 'RBRACE',\n LBRACKET: 'LBRACKET',\n RBRACKET: 'RBRACKET',\n COLON: 'COLON',\n SEMICOLON: 'SEMICOLON',\n COMMA: 'COMMA',\n DOT: 'DOT',\n ARROW: 'ARROW',\n FAT_ARROW: 'FAT_ARROW',\n \n // Special\n EOF: 'EOF',\n ERROR: 'ERROR',\n};\n\nclass Token {\n constructor(type, value, line, column) {\n this.type = type;\n this.value = value;\n this.line = line;\n this.column = column;\n }\n\n toString() {\n return `Token(${this.type}, \"${this.value}\", ${this.line}:${this.column})`;\n }\n}\n\nclass Lexer {\n constructor(source) {\n this.source = source;\n this.position = 0;\n this.line = 1;\n this.column = 1;\n this.tokens = [];\n }\n\n error(message) {\n return new Token(TokenType.ERROR, message, this.line, this.column);\n }\n\n peek(offset = 0) {\n const pos = this.position + offset;\n if (pos >= this.source.length) return '\\0';\n return this.source[pos];\n }\n\n advance() {\n const char = this.source[this.position];\n this.position++;\n if (char === '\\n') {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n return char;\n }\n\n skipWhitespace() {\n while (this.position < this.source.length && /\\s/.test(this.peek())) {\n this.advance();\n }\n }\n\n skipComment() {\n if (this.peek() === '/' && this.peek(1) === '/') {\n while (this.peek() !== '\\n' && this.peek() !== '\\0') {\n this.advance();\n }\n return true;\n }\n return false;\n }\n\n readIdentifier() {\n let value = '';\n while (/[a-zA-Z0-9_]/.test(this.peek())) {\n value += this.advance();\n }\n return value;\n }\n\n readNumber() {\n let value = '';\n while (/[0-9]/.test(this.peek())) {\n value += this.advance();\n }\n if (this.peek() === '.' && /[0-9]/.test(this.peek(1))) {\n value += this.advance(); // '.'\n while (/[0-9]/.test(this.peek())) {\n value += this.advance();\n }\n }\n return value;\n }\n\n readString(quote) {\n let value = '';\n this.advance(); // opening quote\n while (this.peek() !== quote && this.peek() !== '\\0') {\n if (this.peek() === '\\\\') {\n this.advance();\n const escaped = this.advance();\n value += this.getEscapeSequence(escaped);\n } else {\n value += this.advance();\n }\n }\n if (this.peek() === quote) {\n this.advance(); // closing quote\n } else {\n return this.error('Unterminated string');\n }\n return value;\n }\n\n getEscapeSequence(char) {\n const escapes = {\n 'n': '\\n',\n 't': '\\t',\n 'r': '\\r',\n '\\\\': '\\\\',\n '\"': '\"',\n \"'\": \"'\",\n };\n return escapes[char] || char;\n }\n\n tokenize() {\n const keywords = {\n 'fn': TokenType.FN,\n 'const': TokenType.CONST,\n 'var': TokenType.VAR,\n 'struct': TokenType.STRUCT,\n 'union': TokenType.UNION,\n 'enum': TokenType.ENUM,\n 'if': TokenType.IF,\n 'else': TokenType.ELSE,\n 'while': TokenType.WHILE,\n 'for': TokenType.FOR,\n 'return': TokenType.RETURN,\n 'break': TokenType.BREAK,\n 'continue': TokenType.CONTINUE,\n 'comptime': TokenType.COMPTIME,\n 'inline': TokenType.INLINE,\n 'i32': TokenType.I32,\n 'i64': TokenType.I64,\n 'u32': TokenType.U32,\n 'f32': TokenType.F32,\n 'f64': TokenType.F64,\n 'bool': TokenType.BOOL,\n 'void': TokenType.VOID,\n 'true': TokenType.TRUE,\n 'false': TokenType.FALSE,\n };\n\n while (this.position < this.source.length) {\n this.skipWhitespace();\n if (this.skipComment()) continue;\n\n const char = this.peek();\n const line = this.line;\n const column = this.column;\n\n if (char === '\\0') break;\n\n // Numbers\n if (/[0-9]/.test(char)) {\n const value = this.readNumber();\n this.tokens.push(new Token(TokenType.NUMBER, value, line, column));\n continue;\n }\n\n // Strings\n if (char === '\"' || char === \"'\") {\n const value = this.readString(char);\n if (value instanceof Token) {\n this.tokens.push(value);\n } else {\n this.tokens.push(new Token(TokenType.STRING, value, line, column));\n }\n continue;\n }\n\n // Identifiers and keywords\n if (/[a-zA-Z_]/.test(char)) {\n const value = this.readIdentifier();\n const type = keywords[value] || TokenType.IDENT;\n this.tokens.push(new Token(type, value, line, column));\n continue;\n }\n\n // Operators and punctuation\n this.advance();\n if (char === '+') {\n if (this.peek() === '=') {\n this.advance();\n this.tokens.push(new Token(TokenType.PLUS_ASSIGN, '+=', line, column));\n } else {\n this.tokens.push(new Token(TokenType.PLUS, '+', line, column));\n }\n } else if (char === '-') {\n if (this.peek() === '>') {\n this.advance();\n this.tokens.push(new Token(TokenType.ARROW, '->', line, column));\n } else {\n this.tokens.push(new Token(TokenType.MINUS, '-', line, column));\n }\n } else if (char === '*') {\n this.tokens.push(new Token(TokenType.STAR, '*', line, column));\n } else if (char === '/') {\n this.tokens.push(new Token(TokenType.SLASH, '/', line, column));\n } else if (char === '%') {\n this.tokens.push(new Token(TokenType.PERCENT, '%', line, column));\n } else if (char === '=') {\n if (this.peek() === '=') {\n this.advance();\n this.tokens.push(new Token(TokenType.EQ, '==', line, column));\n } else if (this.peek() === '>') {\n this.advance();\n this.tokens.push(new Token(TokenType.FAT_ARROW, '=>', line, column));\n } else {\n this.tokens.push(new Token(TokenType.ASSIGN, '=', line, column));\n }\n } else if (char === '!') {\n if (this.peek() === '=') {\n this.advance();\n this.tokens.push(new Token(TokenType.NEQ, '!=', line, column));\n } else {\n this.tokens.push(new Token(TokenType.NOT, '!', line, column));\n }\n } else if (char === '<') {\n if (this.peek() === '=') {\n this.advance();\n this.tokens.push(new Token(TokenType.LTE, '<=', line, column));\n } else {\n this.tokens.push(new Token(TokenType.LT, '<', line, column));\n }\n } else if (char === '>') {\n if (this.peek() === '=') {\n this.advance();\n this.tokens.push(new Token(TokenType.GTE, '>=', line, column));\n } else {\n this.tokens.push(new Token(TokenType.GT, '>', line, column));\n }\n } else if (char === '&') {\n if (this.peek() === '&') {\n this.advance();\n this.tokens.push(new Token(TokenType.AND, '&&', line, column));\n } else {\n this.tokens.push(new Token(TokenType.ERROR, `Unexpected char: &`, line, column));\n }\n } else if (char === '|') {\n if (this.peek() === '|') {\n this.advance();\n this.tokens.push(new Token(TokenType.OR, '||', line, column));\n } else {\n this.tokens.push(new Token(TokenType.ERROR, `Unexpected char: |`, line, column));\n }\n } else if (char === '(') {\n this.tokens.push(new Token(TokenType.LPAREN, '(', line, column));\n } else if (char === ')') {\n this.tokens.push(new Token(TokenType.RPAREN, ')', line, column));\n } else if (char === '{') {\n this.tokens.push(new Token(TokenType.LBRACE, '{', line, column));\n } else if (char === '}') {\n this.tokens.push(new Token(TokenType.RBRACE, '}', line, column));\n } else if (char === '[') {\n this.tokens.push(new Token(TokenType.LBRACKET, '[', line, column));\n } else if (char === ']') {\n this.tokens.push(new Token(TokenType.RBRACKET, ']', line, column));\n } else if (char === ':') {\n this.tokens.push(new Token(TokenType.COLON, ':', line, column));\n } else if (char === ';') {\n this.tokens.push(new Token(TokenType.SEMICOLON, ';', line, column));\n } else if (char === ',') {\n this.tokens.push(new Token(TokenType.COMMA, ',', line, column));\n } else if (char === '.') {\n this.tokens.push(new Token(TokenType.DOT, '.', line, column));\n } else {\n this.tokens.push(new Token(TokenType.ERROR, `Unexpected char: ${char}`, line, column));\n }\n }\n\n this.tokens.push(new Token(TokenType.EOF, '', this.line, this.column));\n return this.tokens;\n }\n}\n\nmodule.exports = { Lexer, Token, TokenType };","/**\n * Recursive Descent Parser for Zig\n */\n\nimport { Token, TokenType } from './lexer.js';\nimport type {\n Program,\n Declaration,\n FunctionDeclaration,\n VariableDeclaration,\n StructDeclaration,\n Parameter,\n TypeAnnotation,\n PrimitiveType,\n IdentifierType,\n Statement,\n BlockStatement,\n ReturnStatement,\n IfStatement,\n WhileStatement,\n ExpressionStatement,\n ComptimeStatement,\n Expression,\n BinaryExpression,\n UnaryExpression,\n CallExpression,\n MemberExpression,\n IndexExpression,\n Identifier,\n NumberLiteral,\n StringLiteral,\n BooleanLiteral,\n AssignmentExpression,\n StructField,\n} from './ast.js';\n\n/**\n * Parser error class\n */\nexport class ParseError extends Error {\n constructor(\n message: string,\n public token: Token\n ) {\n super(message);\n this.name = 'ParseError';\n }\n\n toString(): string {\n return `${this.name} at ${this.token.line}:${this.token.column}: ${this.message}`;\n }\n}\n\n/**\n * Parser class\n */\nexport class Parser {\n private position = 0;\n\n constructor(private tokens: Token[]) {}\n\n /**\n * Parse the entire program\n */\n parse(): Program {\n const body: Declaration[] = [];\n\n while (!this.isAtEnd()) {\n body.push(this.parseDeclaration());\n }\n\n return {\n type: 'Program',\n body,\n };\n }\n\n /**\n * Parse a top-level declaration\n */\n private parseDeclaration(): Declaration {\n // Check for inline or comptime modifiers\n const isInline = this.match(TokenType.INLINE);\n const isComptime = this.match(TokenType.COMPTIME);\n\n if (this.check(TokenType.FN)) {\n return this.parseFunctionDeclaration(isInline, isComptime);\n }\n\n if (this.check(TokenType.CONST) || this.check(TokenType.VAR)) {\n const decl = this.parseVariableDeclaration();\n\n // Check if this is a struct/union/enum declaration\n if (\n decl.initializer &&\n decl.initializer.type === 'Identifier' &&\n (this.previous().type === TokenType.STRUCT ||\n this.previous().type === TokenType.UNION ||\n this.previous().type === TokenType.ENUM)\n ) {\n // This might be a struct/union/enum, but for now treat as variable\n return decl;\n }\n\n return decl;\n }\n\n throw this.error('Expected declaration');\n }\n\n /**\n * Parse function declaration\n */\n private parseFunctionDeclaration(isInline = false, isComptime = false): FunctionDeclaration {\n const fnToken = this.consume(TokenType.FN, \"Expected 'fn'\");\n const name = this.consume(TokenType.IDENT, 'Expected function name').value;\n\n this.consume(TokenType.LPAREN, \"Expected '(' after function name\");\n const parameters = this.parseParameters();\n this.consume(TokenType.RPAREN, \"Expected ')' after parameters\");\n\n // Check for error union return type (!)\n const errorUnion = this.match(TokenType.NOT);\n\n const returnType = this.parseTypeAnnotation();\n const body = this.parseBlockStatement();\n\n return {\n type: 'FunctionDeclaration',\n name,\n parameters,\n returnType,\n body,\n isInline,\n isComptime,\n errorUnion,\n line: fnToken.line,\n column: fnToken.column,\n };\n }\n\n /**\n * Parse function parameters\n */\n private parseParameters(): Parameter[] {\n const parameters: Parameter[] = [];\n\n if (!this.check(TokenType.RPAREN)) {\n do {\n const isComptime = this.match(TokenType.COMPTIME);\n const paramToken = this.consume(TokenType.IDENT, 'Expected parameter name');\n const name = paramToken.value;\n\n this.consume(TokenType.COLON, \"Expected ':' after parameter name\");\n const typeAnnotation = this.parseTypeAnnotation();\n\n parameters.push({\n type: 'Parameter',\n name,\n typeAnnotation,\n isComptime,\n line: paramToken.line,\n column: paramToken.column,\n });\n } while (this.match(TokenType.COMMA));\n }\n\n return parameters;\n }\n\n /**\n * Parse variable declaration\n */\n private parseVariableDeclaration(): VariableDeclaration {\n const isConst = this.match(TokenType.CONST);\n if (!isConst) {\n this.consume(TokenType.VAR, \"Expected 'const' or 'var'\");\n }\n\n const nameToken = this.consume(TokenType.IDENT, 'Expected variable name');\n const name = nameToken.value;\n\n let typeAnnotation: TypeAnnotation | undefined;\n if (this.match(TokenType.COLON)) {\n typeAnnotation = this.parseTypeAnnotation();\n }\n\n let initializer: Expression | undefined;\n if (this.match(TokenType.ASSIGN)) {\n initializer = this.parseExpression();\n }\n\n this.consume(TokenType.SEMICOLON, \"Expected ';' after variable declaration\");\n\n return {\n type: 'VariableDeclaration',\n isConst,\n name,\n typeAnnotation,\n initializer,\n line: nameToken.line,\n column: nameToken.column,\n };\n }\n\n /**\n * Parse type annotation\n */\n private parseTypeAnnotation(): TypeAnnotation {\n const token = this.current();\n\n // Primitive types\n if (\n this.check(TokenType.I32) ||\n this.check(TokenType.I64) ||\n this.check(TokenType.U32) ||\n this.check(TokenType.F32) ||\n this.check(TokenType.F64) ||\n this.check(TokenType.BOOL) ||\n this.check(TokenType.VOID)\n ) {\n this.advance();\n return {\n type: 'PrimitiveType',\n name: token.value,\n line: token.line,\n column: token.column,\n };\n }\n\n // Custom types (identifiers)\n if (this.check(TokenType.IDENT)) {\n const name = this.advance().value;\n return {\n type: 'IdentifierType',\n name,\n line: token.line,\n column: token.column,\n };\n }\n\n throw this.error('Expected type annotation');\n }\n\n /**\n * Parse block statement\n */\n private parseBlockStatement(): BlockStatement {\n const lbrace = this.consume(TokenType.LBRACE, \"Expected '{'\");\n const statements: Statement[] = [];\n\n while (!this.check(TokenType.RBRACE) && !this.isAtEnd()) {\n statements.push(this.parseStatement());\n }\n\n this.consume(TokenType.RBRACE, \"Expected '}'\");\n\n return {\n type: 'BlockStatement',\n statements,\n line: lbrace.line,\n column: lbrace.column,\n };\n }\n\n /**\n * Parse statement\n */\n private parseStatement(): Statement {\n if (this.check(TokenType.RETURN)) {\n return this.parseReturnStatement();\n }\n\n if (this.check(TokenType.IF)) {\n return this.parseIfStatement();\n }\n\n if (this.check(TokenType.WHILE)) {\n return this.parseWhileStatement();\n }\n\n if (this.check(TokenType.BREAK)) {\n const token = this.advance();\n this.consume(TokenType.SEMICOLON, \"Expected ';' after 'break'\");\n return {\n type: 'BreakStatement',\n line: token.line,\n column: token.column,\n };\n }\n\n if (this.check(TokenType.CONTINUE)) {\n const token = this.advance();\n this.consume(TokenType.SEMICOLON, \"Expected ';' after 'continue'\");\n return {\n type: 'ContinueStatement',\n line: token.line,\n column: token.column,\n };\n }\n\n if (this.check(TokenType.COMPTIME)) {\n return this.parseComptimeStatement();\n }\n\n if (this.check(TokenType.CONST) || this.check(TokenType.VAR)) {\n return this.parseVariableDeclaration();\n }\n\n if (this.check(TokenType.LBRACE)) {\n return this.parseBlockStatement();\n }\n\n // Expression statement\n return this.parseExpressionStatement();\n }\n\n /**\n * Parse return statement\n */\n private parseReturnStatement(): ReturnStatement {\n const returnToken = this.consume(TokenType.RETURN, \"Expected 'return'\");\n\n let value: Expression | undefined;\n if (!this.check(TokenType.SEMICOLON)) {\n value = this.parseExpression();\n }\n\n this.consume(TokenType.SEMICOLON, \"Expected ';' after return statement\");\n\n return {\n type: 'ReturnStatement',\n value,\n line: returnToken.line,\n column: returnToken.column,\n };\n }\n\n /**\n * Parse if statement\n */\n private parseIfStatement(): IfStatement {\n const ifToken = this.consume(TokenType.IF, \"Expected 'if'\");\n\n this.consume(TokenType.LPAREN, \"Expected '(' after 'if'\");\n const condition = this.parseExpression();\n this.consume(TokenType.RPAREN, \"Expected ')' after condition\");\n\n const consequent = this.parseStatement();\n\n let alternate: Statement | undefined;\n if (this.match(TokenType.ELSE)) {\n alternate = this.parseStatement();\n }\n\n return {\n type: 'IfStatement',\n condition,\n consequent,\n alternate,\n line: ifToken.line,\n column: ifToken.column,\n };\n }\n\n /**\n * Parse while statement\n */\n private parseWhileStatement(): WhileStatement {\n const whileToken = this.consume(TokenType.WHILE, \"Expected 'while'\");\n\n this.consume(TokenType.LPAREN, \"Expected '(' after 'while'\");\n const condition = this.parseExpression();\n this.consume(TokenType.RPAREN, \"Expected ')' after condition\");\n\n const body = this.parseStatement();\n\n return {\n type: 'WhileStatement',\n condition,\n body,\n line: whileToken.line,\n column: whileToken.column,\n };\n }\n\n /**\n * Parse comptime statement\n */\n private parseComptimeStatement(): ComptimeStatement {\n const comptimeToken = this.consume(TokenType.COMPTIME, \"Expected 'comptime'\");\n const body = this.parseBlockStatement();\n\n return {\n type: 'ComptimeStatement',\n body,\n line: comptimeToken.line,\n column: comptimeToken.column,\n };\n }\n\n /**\n * Parse expression statement\n */\n private parseExpressionStatement(): ExpressionStatement {\n const expr = this.parseExpression();\n this.consume(TokenType.SEMICOLON, \"Expected ';' after expression\");\n\n return {\n type: 'ExpressionStatement',\n expression: expr,\n line: expr.line,\n column: expr.column,\n };\n }\n\n /**\n * Parse expression (starting point for precedence climbing)\n */\n private parseExpression(): Expression {\n return this.parseAssignment();\n }\n\n /**\n * Parse assignment expression\n */\n private parseAssignment(): Expression {\n const expr = this.parseLogicalOr();\n\n if (this.match(TokenType.ASSIGN, TokenType.PLUS_ASSIGN)) {\n const operator = this.previous().value;\n const right = this.parseAssignment();\n\n return {\n type: 'AssignmentExpression',\n operator,\n left: expr,\n right,\n line: expr.line,\n column: expr.column,\n };\n }\n\n return expr;\n }\n\n /**\n * Parse logical OR expression\n */\n private parseLogicalOr(): Expression {\n let left = this.parseLogicalAnd();\n\n while (this.match(TokenType.OR)) {\n const operator = this.previous().value;\n const right = this.parseLogicalAnd();\n\n left = {\n type: 'BinaryExpression',\n operator,\n left,\n right,\n line: left.line,\n column: left.column,\n };\n }\n\n return left;\n }\n\n /**\n * Parse logical AND expression\n */\n private parseLogicalAnd(): Expression {\n let left = this.parseEquality();\n\n while (this.match(TokenType.AND)) {\n const operator = this.previous().value;\n const right = this.parseEquality();\n\n left = {\n type: 'BinaryExpression',\n operator,\n left,\n right,\n line: left.line,\n column: left.column,\n };\n }\n\n return left;\n }\n\n /**\n * Parse equality expression (==, !=)\n */\n private parseEquality(): Expression {\n let left = this.parseComparison();\n\n while (this.match(TokenType.EQ, TokenType.NEQ)) {\n const operator = this.previous().value;\n const right = this.parseComparison();\n\n left = {\n type: 'BinaryExpression',\n operator,\n left,\n right,\n line: left.line,\n column: left.column,\n };\n }\n\n return left;\n }\n\n /**\n * Parse comparison expression (<, >, <=, >=)\n */\n private parseComparison(): Expression {\n let left = this.parseAddition();\n\n while (this.match(TokenType.LT, TokenType.GT, TokenType.LTE, TokenType.GTE)) {\n const operator = this.previous().value;\n const right = this.parseAddition();\n\n left = {\n type: 'BinaryExpression',\n operator,\n left,\n right,\n line: left.line,\n column: left.column,\n };\n }\n\n return left;\n }\n\n /**\n * Parse addition/subtraction expression\n */\n private parseAddition(): Expression {\n let left = this.parseMultiplication();\n\n while (this.match(TokenType.PLUS, TokenType.MINUS)) {\n const operator = this.previous().value;\n const right = this.parseMultiplication();\n\n left = {\n type: 'BinaryExpression',\n operator,\n left,\n right,\n line: left.line,\n column: left.column,\n };\n }\n\n return left;\n }\n\n /**\n * Parse multiplication/division expression\n */\n private parseMultiplication(): Expression {\n let left = this.parseUnary();\n\n while (this.match(TokenType.STAR, TokenType.SLASH, TokenType.PERCENT)) {\n const operator = this.previous().value;\n const right = this.parseUnary();\n\n left = {\n type: 'BinaryExpression',\n operator,\n left,\n right,\n line: left.line,\n column: left.column,\n };\n }\n\n return left;\n }\n\n /**\n * Parse unary expression (-, !)\n */\n private parseUnary(): Expression {\n if (this.match(TokenType.MINUS, TokenType.NOT)) {\n const operator = this.previous();\n\n return {\n type: 'UnaryExpression',\n operator: operator.value,\n operand: this.parseUnary(),\n line: operator.line,\n column: operator.column,\n };\n }\n\n return this.parsePostfix();\n }\n\n /**\n * Parse postfix expression (call, member access, index)\n */\n private parsePostfix(): Expression {\n let expr = this.parsePrimary();\n\n while (true) {\n if (this.match(TokenType.LPAREN)) {\n // Function call\n const args: Expression[] = [];\n\n if (!this.check(TokenType.RPAREN)) {\n do {\n args.push(this.parseExpression());\n } while (this.match(TokenType.COMMA));\n }\n\n this.consume(TokenType.RPAREN, \"Expected ')' after arguments\");\n\n expr = {\n type: 'CallExpression',\n callee: expr,\n arguments: args,\n line: expr.line,\n column: expr.column,\n };\n } else if (this.match(TokenType.DOT)) {\n // Member access\n const property = this.consume(TokenType.IDENT, 'Expected property name').value;\n\n expr = {\n type: 'MemberExpression',\n object: expr,\n property,\n line: expr.line,\n column: expr.column,\n };\n } else if (this.match(TokenType.LBRACKET)) {\n // Index access\n const index = this.parseExpression();\n this.consume(TokenType.RBRACKET, \"Expected ']' after index\");\n\n expr = {\n type: 'IndexExpression',\n object: expr,\n index,\n line: expr.line,\n column: expr.column,\n };\n } else {\n break;\n }\n }\n\n return expr;\n }\n\n /**\n * Parse primary expression (literals, identifiers, grouped expressions)\n */\n private parsePrimary(): Expression {\n const token = this.current();\n\n // Numbers\n if (this.match(TokenType.NUMBER)) {\n return {\n type: 'NumberLiteral',\n value: parseFloat(this.previous().value),\n line: token.line,\n column: token.column,\n };\n }\n\n // Strings\n if (this.match(TokenType.STRING)) {\n return {\n type: 'StringLiteral',\n value: this.previous().value,\n line: token.line,\n column: token.column,\n };\n }\n\n // Booleans\n if (this.match(TokenType.TRUE)) {\n return {\n type: 'BooleanLiteral',\n value: true,\n line: token.line,\n column: token.column,\n };\n }\n\n if (this.match(TokenType.FALSE)) {\n return {\n type: 'BooleanLiteral',\n value: false,\n line: token.line,\n column: token.column,\n };\n }\n\n // Identifiers\n if (this.match(TokenType.IDENT)) {\n return {\n type: 'Identifier',\n name: this.previous().value,\n line: token.line,\n column: token.column,\n };\n }\n\n // Grouped expression\n if (this.match(TokenType.LPAREN)) {\n const expr = this.parseExpression();\n this.consume(TokenType.RPAREN, \"Expected ')' after expression\");\n return expr;\n }\n\n throw this.error('Expected expression');\n }\n\n // ==================== Helper Methods ====================\n\n /**\n * Check if current token matches any of the given types\n */\n private match(...types: TokenType[]): boolean {\n for (const type of types) {\n if (this.check(type)) {\n this.advance();\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if current token is of given type\n */\n private check(type: TokenType): boolean {\n if (this.isAtEnd()) return false;\n return this.current().type === type;\n }\n\n /**\n * Consume current token if it matches expected type, otherwise throw error\n */\n private consume(type: TokenType, message: string): Token {\n if (this.check(type)) {\n return this.advance();\n }\n\n throw this.error(message);\n }\n\n /**\n * Advance to next token\n */\n private advance(): Token {\n if (!this.isAtEnd()) {\n this.position++;\n }\n return this.previous();\n }\n\n /**\n * Check if at end of token stream\n */\n private isAtEnd(): boolean {\n return this.current().type === TokenType.EOF;\n }\n\n /**\n * Get current token\n */\n private current(): Token {\n return this.tokens[this.position];\n }\n\n /**\n * Get previous token\n */\n private previous(): Token {\n return this.tokens[this.position - 1];\n }\n\n /**\n * Create a parse error\n */\n private error(message: string): ParseError {\n return new ParseError(message, this.current());\n }\n}\n"],"mappings":"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"}