@language Bolt; @language JS; // Bolt language AST definitions type BoltValue = Integer | bool | String; node FunctionBody; node BoltToken; node BoltStringLiteral > BoltToken { value: String, } node BoltIntegerLiteral > BoltToken { value: Int, } node BoltSymbol > BoltToken { } node BoltIdentifier > BoltSymbol { text: String, } node BoltOperator > BoltSymbol { text: String, } node BoltAssignment > BoltToken { operator: Option, } node BoltEOS > BoltToken; node BoltComma > BoltToken; node BoltSemi > BoltToken; node BoltColon > BoltToken; node BoltDot > BoltToken; node BoltDotDot > BoltToken; node BoltRArrow > BoltToken; node BoltLArrow > BoltToken; node BoltEqSign > BoltToken; node BoltGtSign > BoltToken; node BoltLtSign > BoltToken; node BoltKeyword; node BoltFnKeyword > BoltToken, BoltKeyword; node BoltForeignKeyword > BoltToken, BoltKeyword; node BoltLetKeyword > BoltToken, BoltKeyword; node BoltReturnKeyword > BoltToken, BoltKeyword; node BoltLoopKeyword > BoltToken, BoltKeyword; node BoltYieldKeyword > BoltToken, BoltKeyword; node BoltMatchKeyword > BoltToken, BoltKeyword; node BoltImportKeyword > BoltToken, BoltKeyword; node BoltPubKeyword > BoltToken, BoltKeyword; node BoltModKeyword > BoltToken, BoltKeyword; node BoltMutKeyword > BoltToken, BoltKeyword; node BoltEnumKeyword > BoltToken, BoltKeyword; node BoltStructKeyword > BoltToken, BoltKeyword; node BoltNewTypeKeyword > BoltToken, BoltKeyword; node BoltPunctuated > BoltToken { text: String, } node BoltParenthesized > BoltPunctuated; node BoltBraced > BoltPunctuated; node BoltBracketed > BoltPunctuated; node BoltSourceFile { elements: Vec, } node BoltQualName { modulePath: Vec, name: BoltSymbol, } node BoltSentence > BoltSourceElement { tokens: Vec, } node BoltTypeNode; node BoltReferenceTypeNode > BoltTypeNode { name: BoltQualName, arguments: Option>, } node BoltPattern; node BoltBindPattern > BoltPattern { name: BoltIdentifier, } node BoltTypePattern > BoltPattern { type: BoltTypeNode, nestedPattern: BoltPattern, } node BoltExpressionPattern > BoltPattern { expression: BoltExpression, } node BoltTuplePatternElement { index: usize, pattern: BoltPattern, } node BoltTuplePattern > BoltPattern { elements: Vec, } node BoltRecordPatternField { name: BoltIdentifier, pattern: BoltPattern, } node BoltRecordPattern > BoltPattern { name: BoltTypeNode, fields: Vec, } node BoltExpression; node BoltReferenceExpression > BoltExpression { name: BoltQualName, } node BoltCallExpression > BoltExpression { operator: BoltExpression, operands: Vec, } node BoltYieldExpression > BoltExpression { value: BoltExpression, } node BoltMatchArm { pattern: BoltPattern, body: BoltExpression, } node BoltMatchExpression > BoltExpression { value: BoltExpression, arms: Vec, } node BoltCase { test: BoltExpression, result: BoltExpression, } node BoltCaseExpression > BoltExpression { cases: Vec, } node BoltBlockExpression > BoltExpression { statements: Vec, } node BoltConstantExpression > BoltExpression { value: BoltValue, } node BoltStatement > BoltSourceElement; node BoltReturnStatement > BoltStatement { value: Option, } node BoltResumeStatement > BoltStatement { value: BoltExpression, } node BoltExpressionStatement > BoltStatement { expression: BoltExpression, } node BoltParameter { index: usize, bindings: BoltPattern, type: Option, defaultValue: Option, } node BoltDeclaration > BoltSourceElement; enum BoltDeclarationModifiers { Mutable = 0x1, Public = 0x2, IsType = 0x4, IsForeign = 0x8, } node BoltNewTypeDeclaration > BoltDeclaration { modifiers: BoltDeclarationModifiers, name: BoltIdentifier, } node BoltModule > BoltDeclaration { modifiers: BoltDeclarationModifiers, name: BoltQualName, elements: Vec, } node BoltFunctionDeclaration > BoltDeclaration { modifiers: BoltDeclarationModifiers, target: String, name: BoltSymbol, params: Vec, returnType: Option, body: Vec, } node BoltVariableDeclaration > BoltDeclaration { modifiers: BoltDeclarationModifiers, bindings: BoltPattern, type: Option, value: Option, } node BoltImportSymbol; node BoltPlainImportSymbol > BoltImportSymbol { name: BoltQualName, } node BoltImportDeclaration > BoltDeclaration { file: String, symbols: Vec, } node BoltRecordDeclarationField { name: BoltIdentifier, type: BoltTypeNode, } node BoltSourceElement; node BoltRecordDeclaration > BoltDeclaration { modifiers: BoltDeclarationModifiers, name: BoltQualName, fields: Vec, } // JavaScript AST definitions type JSValue = Int | String | Bool | Void; node JSToken; node JSOperator > JSToken { text: String, } node JSIdentifier > JSToken { text: String, } node JSPattern; node JSBindPattern > JSPattern { name: JSIdentifier, } node JSExpression; node JSConstantExpression > JSExpression { value: BoltValue, } enum JSMemberExpressionModifiers { Computed = 0x1, } node JSMemberExpression > JSExpression { value: JSExpression, property: JSExpression, modifiers: JSMemberExpressionModifiers, } node JSCallExpression > JSExpression { operator: JSExpression, operands: Vec, } node JSBinaryExpression > JSExpression { left: JSExpression, operator: JSOperator, right: JSExpression, } node JSUnaryExpression > JSExpression { operator: JSOperator, operand: JSExpression } node JSNewExpression > JSExpression { target: JSExpression, arguments: Vec, } node JSSequenceExpression > JSExpression { expressions: Vec, } node JSConditionalExpression > JSExpression { test: JSExpression, consequent: JSExpression, alternate: JSExpression, } node JSReferenceExpression > JSExpression { name: String, } node JSStatement; node JSExpressionStatement > JSStatement { expression: JSExpression, } node JSConditionalStatement > JSStatement { test: JSExpression, consequent: Vec, alternate: Vec, } node JSParameter { index: usize, bindings: JSPattern, defaultValue: Option, } node JSDeclaration; enum JSDeclarationModifiers { IsExported = 0x1, } node JSFunctionDeclaration > JSDeclaration { modifiers: JSDeclarationModifiers, name: JSIdentifier, params: Vec, body: Vec, } node JSArrowFunctionDeclaration > JSDeclaration { name: JSIdentifier, params: Vec, body: JSExpression, } node JSLetDeclaration > JSDeclaration { bindings: JSPattern, value: Option, } node JSSourceFile { elements: Vec, } node JSSourceElement > JSDeclaration, JSStatement;