UNPKG

@maniascript/parser

Version:
723 lines (722 loc) 30.4 kB
import { type Token } from 'antlr4ng'; import { ProgramContext, ProgramContentContext, RequireContextDirectiveContext, ExtendsDirectiveContext, IncludeDirectiveContext, SettingDirectiveContext, CommandDirectiveContext, StructDirectiveContext, StructDeclarationContext, StructMemberContext, StructAliasingContext, ConstDirectiveContext, ConstDeclarationContext, ConstAliasingContext, ArrayTypeContext, SimpleTypeContext, EnumTypeContext, CustomTypeContext, TextLiteralContext, LiteralContext, IntegerContext, RealContext, BooleanContext, EnumContext, VectorContext, ArrayContext, ArrayExpressionContext, StructureContext, StructureMemberInitializationContext, FunctionCallExpressionContext, FunctionCallContext, FunctionDeclarationContext, LabelDeclarationContext, BlockContext, ParameterContext, MainStatementContext, ExpressionStatementContext, AsExpressionContext, IsExpressionContext, DotAccessExpressionContext, IndexAccessExpressionContext, UnaryMinusExpressionContext, NotExpressionContext, MultiplicativeExpressionContext, AdditiveExpressionContext, ConcatenationExpressionContext, RelationalExpressionContext, EqualityExpressionContext, OrExpressionContext, AndExpressionContext, TextInterpolationExpressionContext, DumptypeExpressionContext, DumpExpressionContext, CastExpressionContext, ThisExpressionContext, NowExpressionContext, AssignmentStatementContext, ReturnStatementContext, LabelStatementContext, AssertStatementContext, ForeachStatementContext, ForStatementContext, WhileStatementContext, MeanwhileStatementContext, BreakStatementContext, ContinueStatementContext, SwitchStatementContext, SwitchCaseContext, SwitchDefaultContext, SwitchtypeStatementContext, SwitchtypeCaseContext, SwitchtypeDefaultContext, ConditionalStatementContext, IfBranchContext, ElseIfBranchContext, ElseBranchContext, LogStatementContext, SleepStatementContext, TuningstartStatementContext, TuningendStatementContext, TuningmarkStatementContext, WaitStatementContext, YieldStatementContext, StructureExpressionContext, VariableDeclarationWithTypeContext, VariableDeclarationWithoutTypeContext, VariableDeclarationLetContext } from '../antlr/ManiaScriptParser.js'; import { SourceLocationRange } from './position.js'; interface AST { program?: Program; } type VisitCallback = ((node: Node) => void) | null; declare enum Kind { Program = "Program", SimpleType = "SimpleType", ClassType = "ClassType", EnumType = "EnumType", CustomType = "CustomType", InvalidType = "InvalidType", ArrayType = "ArrayType", InvalidLiteral = "InvalidLiteral", TextLiteral = "TextLiteral", IntegerLiteral = "IntegerLiteral", RealLiteral = "RealLiteral", BooleanLiteral = "BooleanLiteral", NullLiteral = "NullLiteral", NullIdLiteral = "NullIdLiteral", EnumLiteral = "EnumLiteral", Identifier = "Identifier", InvalidIdentifier = "InvalidIdentifier", RequireContextDirective = "RequireContextDirective", InvalidDirective = "InvalidDirective", ExtendsDirective = "ExtendsDirective", IncludeDirective = "IncludeDirective", InvalidSettingValue = "InvalidSettingValue", SettingDirective = "SettingDirective", CommandDirective = "CommandDirective", StructMemberDeclaration = "StructMemberDeclaration", StructDeclaration = "StructDeclaration", StructAliasing = "StructAliasing", StructDirective = "StructDirective", InvalidConstValue = "InvalidConstValue", ConstDeclaration = "ConstDeclaration", ConstAliasing = "ConstAliasing", ConstDirective = "ConstDirective", InvalidDeclaration = "InvalidDeclaration", VariableDeclaration = "VariableDeclaration", FunctionParameterDeclaration = "FunctionParameterDeclaration", FunctionDeclaration = "FunctionDeclaration", LabelDeclaration = "LabelDeclaration", BlockStatement = "BlockStatement", InvalidStatement = "InvalidStatement", ExpressionStatement = "ExpressionStatement", InvalidExpression = "InvalidExpression", VectorExpression = "VectorExpression", ArrayExpression = "ArrayExpression", StructMemberExpression = "StructMemberExpression", StructExpression = "StructExpression", FunctionCallExpression = "FunctionCallExpression", AsExpression = "AsExpression", IsExpression = "IsExpression", DotAccessExpression = "DotAccessExpression", IndexAccessExpression = "IndexAccessExpression", UnaryExpression = "UnaryExpression", BinaryExpression = "BinaryExpression", LogicalExpression = "LogicalExpression", TemplateTextLiteral = "TemplateTextLiteral", TemplateTextElement = "TemplateTextElement", DumptypeExpression = "DumptypeExpression", DumpExpression = "DumpExpression", CastExpression = "CastExpression", ThisExpression = "ThisExpression", NowExpression = "NowExpression", AssignmentStatement = "AssignmentStatement", ReturnStatement = "ReturnStatement", LabelStatement = "LabelStatement", AssertStatement = "AssertStatement", ForeachStatement = "ForeachStatement", ForStatement = "ForStatement", WhileStatement = "WhileStatement", MeanwhileStatement = "MeanwhileStatement", BreakStatement = "BreakStatement", ContinueStatement = "ContinueStatement", SwitchStatement = "SwitchStatement", SwitchCase = "SwitchCase", SwitchtypeStatement = "SwitchtypeStatement", SwitchtypeCase = "SwitchtypeCase", ConditionalStatement = "ConditionalStatement", ConditionalBranch = "ConditionalBranch", LogStatement = "LogStatement", SleepStatement = "SleepStatement", TuningstartStatement = "TuningstartStatement", TuningendStatement = "TuningendStatement", TuningmarkStatement = "TuningmarkStatement", WaitStatement = "WaitStatement", YieldStatement = "YieldStatement", Main = "Main" } declare abstract class Node { abstract kind: Kind; source: SourceLocationRange; parent?: Node; constructor(parent: Node | undefined, start: Token | null, stop?: Token | null); enter(enterCb: VisitCallback): void; exit(exitCb: VisitCallback): void; visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class Program extends Node { kind: Kind; directives: Directive[]; declarations: Declaration[]; main?: Main; constructor(program: ProgramContentContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare enum TypeName { Boolean = "Boolean", Ident = "Ident", Int2 = "Int2", Int3 = "Int3", Integer = "Integer", Real = "Real", Text = "Text", Vec2 = "Vec2", Vec3 = "Vec3", Void = "Void", Invalid = "Invalid" } type BaseType = (SimpleType | ClassType | EnumType | CustomType | InvalidType); declare function isBaseType(node: Node): node is BaseType; type KeyType = (BaseType | 'EmptyKey'); type InitializerType = (SimpleType | ClassType | ArrayType | InvalidType); declare function isInitializerType(node: Node): node is InitializerType; type Type = (BaseType | ArrayType); declare function isType(node: Node): node is Type; declare class SimpleType extends Node { kind: Kind; name: TypeName; constructor(parent: Node, simpleType: SimpleTypeContext); } declare class ClassType extends Node { kind: Kind; name: string; constructor(parent: Node, className: Token); } declare class EnumType extends Node { kind: Kind; class?: ClassType; name: Identifier; constructor(parent: Node, enumType: EnumTypeContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class CustomType extends Node { kind: Kind; name: Identifier; constructor(parent: Node, customType: CustomTypeContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class InvalidType extends Node { kind: Kind; error: Error | null; constructor(parent: Node | undefined, start: Token | null, stop?: Token | null, error?: Error | null); } declare class ArrayType extends Node { kind: Kind; value: BaseType; keys: KeyType[]; constructor(parent: Node, arrayType: ArrayTypeContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } type Literal = (TextLiteral | IntegerLiteral | RealLiteral | BooleanLiteral | NullLiteral | NullIdLiteral | EnumLiteral | InvalidLiteral); declare function isLiteral(node: Node): node is Literal; declare class InvalidLiteral extends Node { kind: Kind; error: Error | null; constructor(parent: Node | undefined, start: Token | null, stop?: Token | null, error?: Error | null); } declare class TextLiteral extends Node { kind: Kind; isTranslated: boolean; isMultiline: boolean; value: string; raw: string; constructor(parent: Node, textLiteral: TextLiteralContext); } declare class IntegerLiteral extends Node { kind: Kind; value: number; raw: string; constructor(parent: Node, integerLiteral: IntegerContext); } declare class RealLiteral extends Node { kind: Kind; value: number; raw: string; constructor(parent: Node, realLiteral: RealContext); } declare class BooleanLiteral extends Node { kind: Kind; value: boolean; constructor(parent: Node, booleanLiteral: BooleanContext); } declare class NullLiteral extends Node { kind: Kind; constructor(parent: Node, nullLiteral: LiteralContext); } declare class NullIdLiteral extends Node { kind: Kind; constructor(parent: Node, nullIdLiteral: LiteralContext); } declare class EnumLiteral extends Node { kind: Kind; class?: ClassType | Identifier; name: Identifier; value: Identifier; constructor(parent: Node, enumLiteral: EnumContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class Identifier extends Node { kind: Kind; namespace?: string; name: string; isExpression: boolean; constructor(parent: Node, identifier: Token, namespace?: Token | null, isExpression?: boolean); } declare class InvalidIdentifier extends Node { kind: Kind; } type Directive = (RequireContextDirective | ExtendsDirective | IncludeDirective | SettingDirective | CommandDirective | StructDirective | ConstDirective | InvalidDirective); declare function isDirective(node: Node): node is Directive; declare class InvalidDirective extends Node { kind: Kind; error: Error | null; constructor(parent: Node | undefined, start: Token | null, stop?: Token | null, error?: Error | null); } declare class RequireContextDirective extends Node { kind: Kind; class: ClassType; constructor(parent: Node, requireContextDirective: RequireContextDirectiveContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class ExtendsDirective extends Node { kind: Kind; path: TextLiteral; constructor(parent: Node, extendsDirective: ExtendsDirectiveContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class IncludeDirective extends Node { kind: Kind; path: TextLiteral; alias?: Identifier; constructor(parent: Node, includeDirective: IncludeDirectiveContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class InvalidSettingValue extends Node { kind: Kind; } declare class SettingDirective extends Node { kind: Kind; name: Identifier; value: Literal | VectorExpression | InvalidSettingValue; description?: TextLiteral; constructor(parent: Node, settingDirective: SettingDirectiveContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class CommandDirective extends Node { kind: Kind; name: Identifier; type: Type; description?: TextLiteral; constructor(parent: Node, commandDirective: CommandDirectiveContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class StructMemberDeclaration extends Node { kind: Kind; type: Type; name: Identifier; constructor(parent: Node, structMember: StructMemberContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class StructDeclaration extends Node { kind: Kind; name: Identifier; members: StructMemberDeclaration[]; constructor(parent: Node, structDeclaration: StructDeclarationContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class StructAliasing extends Node { kind: Kind; name: Identifier; alias: Identifier; constructor(parent: Node, structAliasing: StructAliasingContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class StructDirective extends Node { kind: Kind; declaration?: StructDeclaration; aliasing?: StructAliasing; constructor(parent: Node, structDirective: StructDirectiveContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class InvalidConstValue extends Node { kind: Kind; } declare class ConstDeclaration extends Node { kind: Kind; name: Identifier; value: Literal | VectorExpression | ArrayExpression | StructExpression | InvalidConstValue; constructor(parent: Node, constDeclaration: ConstDeclarationContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class ConstAliasing extends Node { kind: Kind; name: Identifier; alias: Identifier; constructor(parent: Node, constAliasing: ConstAliasingContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class ConstDirective extends Node { kind: Kind; declaration?: ConstDeclaration; aliasing?: ConstAliasing; constructor(parent: Node, constDirective: ConstDirectiveContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } type Declaration = (VariableDeclaration | FunctionDeclaration | LabelDeclaration | InvalidDeclaration); declare function isDeclaration(node: Node): node is Declaration; declare enum Storage { cloud = "cloud", metadata = "metadata", netread = "netread", netwrite = "netwrite", persistent = "persistent", invalid = "invalid" } declare enum InitializerSign { '=' = "=", '<=>' = "<=>", invalid = "invalid" } declare class InvalidDeclaration extends Node { kind: Kind; error: Error | null; constructor(parent: Node | undefined, start: Token | null, stop?: Token | null, error?: Error | null); } declare class VariableDeclaration extends Node { kind: Kind; isGlobal: boolean; isLet: boolean; storage?: Storage; type?: Type; name: Identifier; alias?: Identifier; forTarget?: Expression; initializerSign?: InitializerSign; initializerExpression?: Expression; initializerType?: InitializerType; constructor(parent: Node, variableDeclaration: VariableDeclarationWithTypeContext | VariableDeclarationWithoutTypeContext | VariableDeclarationLetContext, isGlobal: boolean); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class FunctionParameterDeclaration extends Node { kind: Kind; type: Type; name: Identifier; constructor(parent: Node, parameter: ParameterContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class FunctionDeclaration extends Node { kind: Kind; type: Type; name: Identifier; parameters: FunctionParameterDeclaration[]; body: BlockStatement; constructor(parent: Node, functionDeclaration: FunctionDeclarationContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class LabelDeclaration extends Node { kind: Kind; name: Identifier; body: Statement[]; constructor(parent: Node, labelDeclaration: LabelDeclarationContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } type Statement = (BlockStatement | InvalidStatement | VariableDeclaration | ExpressionStatement | AssignmentStatement | ReturnStatement | LabelStatement | AssertStatement | ForeachStatement | ForStatement | WhileStatement | MeanwhileStatement | BreakStatement | ContinueStatement | SwitchStatement | SwitchtypeStatement | ConditionalStatement | ConditionalBranch | LogStatement | SleepStatement | TuningstartStatement | TuningendStatement | TuningmarkStatement | WaitStatement | YieldStatement); declare function isStatement(node: Node): node is Statement; declare class BlockStatement extends Node { kind: Kind; body: Statement[]; constructor(parent: Node, block: BlockContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class InvalidStatement extends Node { kind: Kind; error: Error | null; constructor(parent: Node | undefined, start: Token | null, stop?: Token | null, error?: Error | null); } declare class ExpressionStatement extends Node { kind: Kind; expression: Expression; constructor(parent: Node, expressionStatement: ExpressionStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare enum AssignmentOperator { '=' = "=", '<=>' = "<=>", '*=' = "*=", '/=' = "/=", '+=' = "+=", '-=' = "-=", '%=' = "%=", '^=' = "^=" } declare class AssignmentStatement extends Node { kind: Kind; left: Expression; right: Expression | InitializerType; operator: AssignmentOperator; isInitializedByType: boolean; constructor(parent: Node, assignmentStatement: AssignmentStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class ReturnStatement extends Node { kind: Kind; argument?: Expression | InitializerType; isReturningType: boolean; constructor(parent: Node, returnStatement: ReturnStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class LabelStatement extends Node { kind: Kind; isOverwrite: boolean; name: Identifier | InvalidIdentifier; constructor(parent: Node, labelStatement: LabelStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class AssertStatement extends Node { kind: Kind; test: Expression; message?: Expression; constructor(parent: Node, assertStatement: AssertStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class ForeachStatement extends Node { kind: Kind; key?: Identifier; value: Identifier; expression: Expression; body: Statement; constructor(parent: Node, foreachStatement: ForeachStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class ForStatement extends Node { kind: Kind; value: Identifier; loopStart: Expression; loopStop: Expression; increment?: Expression; body: Statement; constructor(parent: Node, forStatement: ForStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class WhileStatement extends Node { kind: Kind; test: Expression; body: Statement; constructor(parent: Node, whileStatement: WhileStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class MeanwhileStatement extends Node { kind: Kind; test: Expression; body: Statement; constructor(parent: Node, meanwhileStatement: MeanwhileStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class BreakStatement extends Node { kind: Kind; constructor(parent: Node, breakStatement: BreakStatementContext); } declare class ContinueStatement extends Node { kind: Kind; constructor(parent: Node, continueStatement: ContinueStatementContext); } declare class SwitchCase extends Node { kind: Kind; tests: Expression[]; consequent: Statement; constructor(parent: Node, switchCase: SwitchCaseContext | SwitchDefaultContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class SwitchStatement extends Node { kind: Kind; discriminant: Expression; cases: SwitchCase[]; constructor(parent: Node, switchStatement: SwitchStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class SwitchtypeCase extends Node { kind: Kind; tests: ClassType[]; consequent: Statement; constructor(parent: Node, switchtypeCase: SwitchtypeCaseContext | SwitchtypeDefaultContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class SwitchtypeStatement extends Node { kind: Kind; discriminant: Expression; alias?: Identifier; cases: SwitchtypeCase[]; constructor(parent: Node, switchtypeStatement: SwitchtypeStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class ConditionalBranch extends Node { kind: Kind; test?: Expression; consequent: Statement; constructor(parent: Node, branch: IfBranchContext | ElseIfBranchContext | ElseBranchContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class ConditionalStatement extends Node { kind: Kind; branches: ConditionalBranch[]; constructor(parent: Node, conditionalStatement: ConditionalStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class LogStatement extends Node { kind: Kind; expression: Expression; constructor(parent: Node, logStatement: LogStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class SleepStatement extends Node { kind: Kind; expression: Expression; constructor(parent: Node, sleepStatement: SleepStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class TuningstartStatement extends Node { kind: Kind; constructor(parent: Node, tuningstartStatement: TuningstartStatementContext); } declare class TuningendStatement extends Node { kind: Kind; constructor(parent: Node, tuningendStatement: TuningendStatementContext); } declare class TuningmarkStatement extends Node { kind: Kind; label: TextLiteral; constructor(parent: Node, tuningmarkStatement: TuningmarkStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class WaitStatement extends Node { kind: Kind; expression: Expression; constructor(parent: Node, waitStatement: WaitStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class YieldStatement extends Node { kind: Kind; constructor(parent: Node, yieldStatement: YieldStatementContext); } type Expression = (VectorExpression | ArrayExpression | StructExpression | Literal | AsExpression | IsExpression | DotAccessExpression | IndexAccessExpression | UnaryExpression | BinaryExpression | LogicalExpression | TemplateTextLiteral | DumptypeExpression | DumpExpression | CastExpression | Identifier | ThisExpression | NowExpression | InvalidExpression); declare function isExpression(node: Node): node is Expression; declare class InvalidExpression extends Node { kind: Kind; error: Error | null; constructor(parent: Node | undefined, start: Token | null, stop?: Token | null, error?: Error | null); } declare class VectorExpression extends Node { kind: Kind; values: Expression[]; constructor(parent: Node, vector: VectorContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class ArrayExpression extends Node { kind: Kind; values: { key?: Expression; value: Expression; }[]; isAssociative: boolean; constructor(parent: Node, array: ArrayContext | ArrayExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class StructMemberExpression extends Node { kind: Kind; name: Identifier; value: Expression; constructor(parent: Node, structureMemberInitialization: StructureMemberInitializationContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class StructExpression extends Node { kind: Kind; name: Identifier; members: StructMemberExpression[]; constructor(parent: Node, structure: StructureContext | StructureExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class FunctionCallExpression extends Node { kind: Kind; name: Identifier; arguments: (Expression | InitializerType)[]; constructor(parent: Node, functionCall: FunctionCallExpressionContext | FunctionCallContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class AsExpression extends Node { kind: Kind; expression: Expression; class: ClassType; constructor(parent: Node, asExpression: AsExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class IsExpression extends Node { kind: Kind; expression: Expression; class: ClassType; constructor(parent: Node, isExpression: IsExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class DotAccessExpression extends Node { kind: Kind; object: Expression; functionCall?: FunctionCallExpression; member?: Identifier; constructor(parent: Node, dotAccessExpression: DotAccessExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class IndexAccessExpression extends Node { kind: Kind; array: Expression; index: Expression; constructor(parent: Node, indexAccessExpression: IndexAccessExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare enum UnaryOperator { '-' = "-", '!' = "!" } declare class UnaryExpression extends Node { kind: Kind; operator: UnaryOperator; argument: Expression; constructor(parent: Node, unaryExpression: UnaryMinusExpressionContext | NotExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare enum BinaryOperator { '*' = "*", '/' = "/", '%' = "%", '+' = "+", '-' = "-", '^' = "^", '<' = "<", '>' = ">", '<=' = "<=", '>=' = ">=", '!=' = "!=", '==' = "==" } declare class BinaryExpression extends Node { kind: Kind; operator: BinaryOperator; left: Expression; right: Expression; constructor(parent: Node, binaryExpression: MultiplicativeExpressionContext | AdditiveExpressionContext | ConcatenationExpressionContext | RelationalExpressionContext | EqualityExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare enum LogicalOperator { '||' = "||", '&&' = "&&" } declare class LogicalExpression extends Node { kind: Kind; operator: LogicalOperator; left: Expression; right: Expression; constructor(parent: Node, logicalExpression: OrExpressionContext | AndExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class TemplateTextElement extends Node { kind: Kind; value: string; constructor(parent: Node, text: Token); } declare class TemplateTextLiteral extends Node { kind: Kind; expressions: Expression[]; texts: TemplateTextElement[]; constructor(parent: Node, textInterpolationExpression: TextInterpolationExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class DumptypeExpression extends Node { kind: Kind; type: Identifier; constructor(parent: Node, dumptypeExpression: DumptypeExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class DumpExpression extends Node { kind: Kind; expression: Expression; constructor(parent: Node, dumpExpression: DumpExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class CastExpression extends Node { kind: Kind; class: ClassType; expression: Expression; constructor(parent: Node, castExpression: CastExpressionContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare class ThisExpression extends Node { kind: Kind; constructor(parent: Node, thisExpression: ThisExpressionContext); } declare class NowExpression extends Node { kind: Kind; constructor(parent: Node, nowExpression: NowExpressionContext); } declare class Main extends Node { kind: Kind; body: BlockStatement; constructor(parent: Node, mainStatetement: MainStatementContext); visit(enterCb: VisitCallback, exitCb: VisitCallback): void; } declare function build(tree: ProgramContext): AST; export { Kind, SourceLocationRange, Node, Program, TypeName, SimpleType, ClassType, EnumType, CustomType, InvalidType, ArrayType, InvalidLiteral, TextLiteral, IntegerLiteral, RealLiteral, BooleanLiteral, NullLiteral, NullIdLiteral, EnumLiteral, Identifier, InvalidIdentifier, RequireContextDirective, InvalidDirective, ExtendsDirective, IncludeDirective, InvalidSettingValue, SettingDirective, CommandDirective, StructMemberDeclaration, StructDeclaration, StructAliasing, StructDirective, InvalidConstValue, ConstDeclaration, ConstAliasing, ConstDirective, Storage, InitializerSign, InvalidDeclaration, VariableDeclaration, FunctionParameterDeclaration, FunctionDeclaration, LabelDeclaration, BlockStatement, InvalidStatement, ExpressionStatement, InvalidExpression, VectorExpression, ArrayExpression, StructMemberExpression, StructExpression, FunctionCallExpression, AsExpression, IsExpression, DotAccessExpression, IndexAccessExpression, UnaryExpression, UnaryOperator, BinaryExpression, BinaryOperator, LogicalExpression, LogicalOperator, TemplateTextLiteral, DumptypeExpression, DumpExpression, CastExpression, ThisExpression, NowExpression, AssignmentStatement, AssignmentOperator, ReturnStatement, LabelStatement, AssertStatement, ForeachStatement, ForStatement, WhileStatement, MeanwhileStatement, BreakStatement, ContinueStatement, SwitchStatement, SwitchCase, SwitchtypeStatement, SwitchtypeCase, ConditionalStatement, ConditionalBranch, LogStatement, SleepStatement, TuningstartStatement, TuningendStatement, TuningmarkStatement, WaitStatement, YieldStatement, Main, isBaseType, isInitializerType, isType, isLiteral, isDirective, isDeclaration, isStatement, isExpression, build }; export type { AST, BaseType, InitializerType, KeyType, Type, Literal, Directive, Declaration, Statement, Expression };