Add support in parser for even more nodes
This commit is contained in:
parent
1a349244a0
commit
aad00c5024
6 changed files with 379 additions and 161 deletions
20
spec/ast.txt
20
spec/ast.txt
|
@ -22,14 +22,14 @@ node BoltIntegerLiteral > BoltToken {
|
||||||
value: Int,
|
value: Int,
|
||||||
}
|
}
|
||||||
|
|
||||||
node BoltSymbol > BoltToken {
|
node BoltSymbol > BoltToken;
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
node BoltIdentifier > BoltSymbol {
|
node BoltIdentifier > BoltSymbol {
|
||||||
text: String,
|
text: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node BoltOperatorLike > BoltSymbol;
|
||||||
|
|
||||||
node BoltOperator > BoltSymbol {
|
node BoltOperator > BoltSymbol {
|
||||||
text: String,
|
text: String,
|
||||||
}
|
}
|
||||||
|
@ -41,14 +41,18 @@ node BoltAssignment > BoltToken {
|
||||||
node BoltComma > BoltToken;
|
node BoltComma > BoltToken;
|
||||||
node BoltSemi > BoltToken;
|
node BoltSemi > BoltToken;
|
||||||
node BoltColon > BoltToken;
|
node BoltColon > BoltToken;
|
||||||
|
node BoltColonColon > BoltToken;
|
||||||
node BoltDot > BoltToken;
|
node BoltDot > BoltToken;
|
||||||
node BoltDotDot > BoltToken;
|
node BoltDotDot > BoltToken;
|
||||||
node BoltRArrow > BoltToken;
|
node BoltRArrow > BoltToken;
|
||||||
node BoltRArrowAlt > BoltToken;
|
node BoltRArrowAlt > BoltToken;
|
||||||
node BoltLArrow > BoltToken;
|
node BoltLArrow > BoltToken;
|
||||||
node BoltEqSign > BoltToken;
|
node BoltEqSign > BoltToken;
|
||||||
node BoltGtSign > BoltToken;
|
|
||||||
node BoltLtSign > BoltToken;
|
node BoltGtSign > BoltToken, BoltOperatorLike;
|
||||||
|
node BoltExMark > BoltToken, BoltOperatorLike;
|
||||||
|
node BoltLtSign > BoltToken, BoltOperatorLike;
|
||||||
|
node BoltVBar > BoltToken, BoltOperatorLike;
|
||||||
|
|
||||||
node BoltKeyword;
|
node BoltKeyword;
|
||||||
|
|
||||||
|
@ -151,6 +155,12 @@ node BoltReferenceExpression > BoltExpression {
|
||||||
name: BoltQualName,
|
name: BoltQualName,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node BoltFunctionExpression > BoltExpression {
|
||||||
|
params: Vec<BoltParameter>,
|
||||||
|
returnType: Option<BoltTypeExpression>,
|
||||||
|
body: Vec<BoltFunctionBodyElement>,
|
||||||
|
}
|
||||||
|
|
||||||
node BoltCallExpression > BoltExpression {
|
node BoltCallExpression > BoltExpression {
|
||||||
operator: BoltExpression,
|
operator: BoltExpression,
|
||||||
operands: Vec<BoltExpression>,
|
operands: Vec<BoltExpression>,
|
||||||
|
|
338
src/ast.d.ts
vendored
338
src/ast.d.ts
vendored
|
@ -5,142 +5,146 @@ export const enum SyntaxKind {
|
||||||
BoltStringLiteral = 8,
|
BoltStringLiteral = 8,
|
||||||
BoltIntegerLiteral = 9,
|
BoltIntegerLiteral = 9,
|
||||||
BoltIdentifier = 11,
|
BoltIdentifier = 11,
|
||||||
BoltOperator = 12,
|
BoltOperator = 13,
|
||||||
BoltAssignment = 13,
|
BoltAssignment = 14,
|
||||||
BoltComma = 14,
|
BoltComma = 15,
|
||||||
BoltSemi = 15,
|
BoltSemi = 16,
|
||||||
BoltColon = 16,
|
BoltColon = 17,
|
||||||
BoltDot = 17,
|
BoltColonColon = 18,
|
||||||
BoltDotDot = 18,
|
BoltDot = 19,
|
||||||
BoltRArrow = 19,
|
BoltDotDot = 20,
|
||||||
BoltRArrowAlt = 20,
|
BoltRArrow = 21,
|
||||||
BoltLArrow = 21,
|
BoltRArrowAlt = 22,
|
||||||
BoltEqSign = 22,
|
BoltLArrow = 23,
|
||||||
BoltGtSign = 23,
|
BoltEqSign = 24,
|
||||||
BoltLtSign = 24,
|
BoltGtSign = 25,
|
||||||
BoltQuoteKeyword = 26,
|
BoltExMark = 26,
|
||||||
BoltFnKeyword = 27,
|
BoltLtSign = 27,
|
||||||
BoltForeignKeyword = 28,
|
BoltVBar = 28,
|
||||||
BoltForKeyword = 29,
|
BoltQuoteKeyword = 30,
|
||||||
BoltLetKeyword = 30,
|
BoltFnKeyword = 31,
|
||||||
BoltReturnKeyword = 31,
|
BoltForeignKeyword = 32,
|
||||||
BoltLoopKeyword = 32,
|
BoltForKeyword = 33,
|
||||||
BoltYieldKeyword = 33,
|
BoltLetKeyword = 34,
|
||||||
BoltMatchKeyword = 34,
|
BoltReturnKeyword = 35,
|
||||||
BoltImportKeyword = 35,
|
BoltLoopKeyword = 36,
|
||||||
BoltPubKeyword = 36,
|
BoltYieldKeyword = 37,
|
||||||
BoltModKeyword = 37,
|
BoltMatchKeyword = 38,
|
||||||
BoltMutKeyword = 38,
|
BoltImportKeyword = 39,
|
||||||
BoltEnumKeyword = 39,
|
BoltPubKeyword = 40,
|
||||||
BoltStructKeyword = 40,
|
BoltModKeyword = 41,
|
||||||
BoltTypeKeyword = 41,
|
BoltMutKeyword = 42,
|
||||||
BoltTraitKeyword = 42,
|
BoltEnumKeyword = 43,
|
||||||
BoltImplKeyword = 43,
|
BoltStructKeyword = 44,
|
||||||
BoltParenthesized = 45,
|
BoltTypeKeyword = 45,
|
||||||
BoltBraced = 46,
|
BoltTraitKeyword = 46,
|
||||||
BoltBracketed = 47,
|
BoltImplKeyword = 47,
|
||||||
BoltSourceFile = 48,
|
BoltParenthesized = 49,
|
||||||
BoltQualName = 49,
|
BoltBraced = 50,
|
||||||
BoltReferenceTypeExpression = 51,
|
BoltBracketed = 51,
|
||||||
BoltFunctionTypeExpression = 52,
|
BoltSourceFile = 52,
|
||||||
BoltTypeParameter = 53,
|
BoltQualName = 53,
|
||||||
BoltBindPattern = 55,
|
BoltReferenceTypeExpression = 55,
|
||||||
BoltTypePattern = 56,
|
BoltFunctionTypeExpression = 56,
|
||||||
BoltExpressionPattern = 57,
|
BoltTypeParameter = 57,
|
||||||
BoltTuplePatternElement = 58,
|
BoltBindPattern = 59,
|
||||||
BoltTuplePattern = 59,
|
BoltTypePattern = 60,
|
||||||
BoltRecordFieldPattern = 60,
|
BoltExpressionPattern = 61,
|
||||||
BoltRecordPattern = 61,
|
BoltTuplePatternElement = 62,
|
||||||
BoltQuoteExpression = 63,
|
BoltTuplePattern = 63,
|
||||||
BoltReferenceExpression = 64,
|
BoltRecordFieldPattern = 64,
|
||||||
BoltCallExpression = 65,
|
BoltRecordPattern = 65,
|
||||||
BoltYieldExpression = 66,
|
BoltQuoteExpression = 67,
|
||||||
BoltMatchArm = 67,
|
BoltReferenceExpression = 68,
|
||||||
BoltMatchExpression = 68,
|
BoltFunctionExpression = 69,
|
||||||
BoltCase = 69,
|
BoltCallExpression = 70,
|
||||||
BoltCaseExpression = 70,
|
BoltYieldExpression = 71,
|
||||||
BoltBlockExpression = 71,
|
BoltMatchArm = 72,
|
||||||
BoltConstantExpression = 72,
|
BoltMatchExpression = 73,
|
||||||
BoltReturnStatement = 74,
|
BoltCase = 74,
|
||||||
BoltConditionalCase = 75,
|
BoltCaseExpression = 75,
|
||||||
BoltConditionalStatement = 76,
|
BoltBlockExpression = 76,
|
||||||
BoltResumeStatement = 77,
|
BoltConstantExpression = 77,
|
||||||
BoltExpressionStatement = 78,
|
BoltReturnStatement = 79,
|
||||||
BoltParameter = 79,
|
BoltConditionalCase = 80,
|
||||||
BoltModule = 83,
|
BoltConditionalStatement = 81,
|
||||||
BoltFunctionDeclaration = 85,
|
BoltResumeStatement = 82,
|
||||||
BoltVariableDeclaration = 86,
|
BoltExpressionStatement = 83,
|
||||||
BoltPlainImportSymbol = 88,
|
BoltParameter = 84,
|
||||||
BoltImportDeclaration = 89,
|
BoltModule = 88,
|
||||||
BoltTraitDeclaration = 90,
|
BoltFunctionDeclaration = 90,
|
||||||
BoltImplDeclaration = 91,
|
BoltVariableDeclaration = 91,
|
||||||
BoltTypeAliasDeclaration = 92,
|
BoltPlainImportSymbol = 93,
|
||||||
BoltRecordField = 94,
|
BoltImportDeclaration = 94,
|
||||||
BoltRecordDeclaration = 95,
|
BoltTraitDeclaration = 95,
|
||||||
BoltMacroCall = 97,
|
BoltImplDeclaration = 96,
|
||||||
JSOperator = 100,
|
BoltTypeAliasDeclaration = 97,
|
||||||
JSIdentifier = 101,
|
BoltRecordField = 99,
|
||||||
JSString = 102,
|
BoltRecordDeclaration = 100,
|
||||||
JSInteger = 103,
|
BoltMacroCall = 102,
|
||||||
JSFromKeyword = 104,
|
JSOperator = 105,
|
||||||
JSReturnKeyword = 105,
|
JSIdentifier = 106,
|
||||||
JSTryKeyword = 106,
|
JSString = 107,
|
||||||
JSFinallyKeyword = 107,
|
JSInteger = 108,
|
||||||
JSCatchKeyword = 108,
|
JSFromKeyword = 109,
|
||||||
JSImportKeyword = 109,
|
JSReturnKeyword = 110,
|
||||||
JSAsKeyword = 110,
|
JSTryKeyword = 111,
|
||||||
JSConstKeyword = 111,
|
JSFinallyKeyword = 112,
|
||||||
JSLetKeyword = 112,
|
JSCatchKeyword = 113,
|
||||||
JSExportKeyword = 113,
|
JSImportKeyword = 114,
|
||||||
JSFunctionKeyword = 114,
|
JSAsKeyword = 115,
|
||||||
JSWhileKeyword = 115,
|
JSConstKeyword = 116,
|
||||||
JSForKeyword = 116,
|
JSLetKeyword = 117,
|
||||||
JSCloseBrace = 117,
|
JSExportKeyword = 118,
|
||||||
JSCloseBracket = 118,
|
JSFunctionKeyword = 119,
|
||||||
JSCloseParen = 119,
|
JSWhileKeyword = 120,
|
||||||
JSOpenBrace = 120,
|
JSForKeyword = 121,
|
||||||
JSOpenBracket = 121,
|
JSCloseBrace = 122,
|
||||||
JSOpenParen = 122,
|
JSCloseBracket = 123,
|
||||||
JSSemi = 123,
|
JSCloseParen = 124,
|
||||||
JSComma = 124,
|
JSOpenBrace = 125,
|
||||||
JSDot = 125,
|
JSOpenBracket = 126,
|
||||||
JSDotDotDot = 126,
|
JSOpenParen = 127,
|
||||||
JSMulOp = 127,
|
JSSemi = 128,
|
||||||
JSAddOp = 128,
|
JSComma = 129,
|
||||||
JSDivOp = 129,
|
JSDot = 130,
|
||||||
JSSubOp = 130,
|
JSDotDotDot = 131,
|
||||||
JSLtOp = 131,
|
JSMulOp = 132,
|
||||||
JSGtOp = 132,
|
JSAddOp = 133,
|
||||||
JSBOrOp = 133,
|
JSDivOp = 134,
|
||||||
JSBXorOp = 134,
|
JSSubOp = 135,
|
||||||
JSBAndOp = 135,
|
JSLtOp = 136,
|
||||||
JSBNotOp = 136,
|
JSGtOp = 137,
|
||||||
JSNotOp = 137,
|
JSBOrOp = 138,
|
||||||
JSBindPattern = 139,
|
JSBXorOp = 139,
|
||||||
JSConstantExpression = 141,
|
JSBAndOp = 140,
|
||||||
JSMemberExpression = 142,
|
JSBNotOp = 141,
|
||||||
JSCallExpression = 143,
|
JSNotOp = 142,
|
||||||
JSBinaryExpression = 144,
|
JSBindPattern = 144,
|
||||||
JSUnaryExpression = 145,
|
JSConstantExpression = 146,
|
||||||
JSNewExpression = 146,
|
JSMemberExpression = 147,
|
||||||
JSSequenceExpression = 147,
|
JSCallExpression = 148,
|
||||||
JSConditionalExpression = 148,
|
JSBinaryExpression = 149,
|
||||||
JSLiteralExpression = 150,
|
JSUnaryExpression = 150,
|
||||||
JSReferenceExpression = 151,
|
JSNewExpression = 151,
|
||||||
JSCatchBlock = 155,
|
JSSequenceExpression = 152,
|
||||||
JSTryCatchStatement = 156,
|
JSConditionalExpression = 153,
|
||||||
JSExpressionStatement = 157,
|
JSLiteralExpression = 155,
|
||||||
JSConditionalCase = 158,
|
JSReferenceExpression = 156,
|
||||||
JSConditionalStatement = 159,
|
JSCatchBlock = 160,
|
||||||
JSReturnStatement = 160,
|
JSTryCatchStatement = 161,
|
||||||
JSParameter = 161,
|
JSExpressionStatement = 162,
|
||||||
JSImportStarBinding = 165,
|
JSConditionalCase = 163,
|
||||||
JSImportAsBinding = 166,
|
JSConditionalStatement = 164,
|
||||||
JSImportDeclaration = 167,
|
JSReturnStatement = 165,
|
||||||
JSFunctionDeclaration = 168,
|
JSParameter = 166,
|
||||||
JSArrowFunctionDeclaration = 169,
|
JSImportStarBinding = 170,
|
||||||
JSLetDeclaration = 170,
|
JSImportAsBinding = 171,
|
||||||
JSSourceFile = 171,
|
JSImportDeclaration = 172,
|
||||||
|
JSFunctionDeclaration = 173,
|
||||||
|
JSArrowFunctionDeclaration = 174,
|
||||||
|
JSLetDeclaration = 175,
|
||||||
|
JSSourceFile = 176,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -170,11 +174,16 @@ export type Token
|
||||||
| BoltStringLiteral
|
| BoltStringLiteral
|
||||||
| BoltIntegerLiteral
|
| BoltIntegerLiteral
|
||||||
| BoltIdentifier
|
| BoltIdentifier
|
||||||
|
| BoltGtSign
|
||||||
|
| BoltExMark
|
||||||
|
| BoltLtSign
|
||||||
|
| BoltVBar
|
||||||
| BoltOperator
|
| BoltOperator
|
||||||
| BoltAssignment
|
| BoltAssignment
|
||||||
| BoltComma
|
| BoltComma
|
||||||
| BoltSemi
|
| BoltSemi
|
||||||
| BoltColon
|
| BoltColon
|
||||||
|
| BoltColonColon
|
||||||
| BoltDot
|
| BoltDot
|
||||||
| BoltDotDot
|
| BoltDotDot
|
||||||
| BoltRArrow
|
| BoltRArrow
|
||||||
|
@ -182,7 +191,9 @@ export type Token
|
||||||
| BoltLArrow
|
| BoltLArrow
|
||||||
| BoltEqSign
|
| BoltEqSign
|
||||||
| BoltGtSign
|
| BoltGtSign
|
||||||
|
| BoltExMark
|
||||||
| BoltLtSign
|
| BoltLtSign
|
||||||
|
| BoltVBar
|
||||||
| BoltQuoteKeyword
|
| BoltQuoteKeyword
|
||||||
| BoltFnKeyword
|
| BoltFnKeyword
|
||||||
| BoltForeignKeyword
|
| BoltForeignKeyword
|
||||||
|
@ -259,11 +270,16 @@ export type BoltToken
|
||||||
| BoltStringLiteral
|
| BoltStringLiteral
|
||||||
| BoltIntegerLiteral
|
| BoltIntegerLiteral
|
||||||
| BoltIdentifier
|
| BoltIdentifier
|
||||||
|
| BoltGtSign
|
||||||
|
| BoltExMark
|
||||||
|
| BoltLtSign
|
||||||
|
| BoltVBar
|
||||||
| BoltOperator
|
| BoltOperator
|
||||||
| BoltAssignment
|
| BoltAssignment
|
||||||
| BoltComma
|
| BoltComma
|
||||||
| BoltSemi
|
| BoltSemi
|
||||||
| BoltColon
|
| BoltColon
|
||||||
|
| BoltColonColon
|
||||||
| BoltDot
|
| BoltDot
|
||||||
| BoltDotDot
|
| BoltDotDot
|
||||||
| BoltRArrow
|
| BoltRArrow
|
||||||
|
@ -271,7 +287,9 @@ export type BoltToken
|
||||||
| BoltLArrow
|
| BoltLArrow
|
||||||
| BoltEqSign
|
| BoltEqSign
|
||||||
| BoltGtSign
|
| BoltGtSign
|
||||||
|
| BoltExMark
|
||||||
| BoltLtSign
|
| BoltLtSign
|
||||||
|
| BoltVBar
|
||||||
| BoltQuoteKeyword
|
| BoltQuoteKeyword
|
||||||
| BoltFnKeyword
|
| BoltFnKeyword
|
||||||
| BoltForeignKeyword
|
| BoltForeignKeyword
|
||||||
|
@ -307,6 +325,10 @@ export interface BoltIntegerLiteral extends SyntaxBase<SyntaxKind.BoltIntegerLit
|
||||||
|
|
||||||
export type BoltSymbol
|
export type BoltSymbol
|
||||||
= BoltIdentifier
|
= BoltIdentifier
|
||||||
|
| BoltGtSign
|
||||||
|
| BoltExMark
|
||||||
|
| BoltLtSign
|
||||||
|
| BoltVBar
|
||||||
| BoltOperator
|
| BoltOperator
|
||||||
|
|
||||||
|
|
||||||
|
@ -315,6 +337,13 @@ export interface BoltIdentifier extends SyntaxBase<SyntaxKind.BoltIdentifier> {
|
||||||
text: string;
|
text: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type BoltOperatorLike
|
||||||
|
= BoltGtSign
|
||||||
|
| BoltExMark
|
||||||
|
| BoltLtSign
|
||||||
|
| BoltVBar
|
||||||
|
|
||||||
|
|
||||||
export interface BoltOperator extends SyntaxBase<SyntaxKind.BoltOperator> {
|
export interface BoltOperator extends SyntaxBase<SyntaxKind.BoltOperator> {
|
||||||
kind: SyntaxKind.BoltOperator;
|
kind: SyntaxKind.BoltOperator;
|
||||||
text: string;
|
text: string;
|
||||||
|
@ -337,6 +366,10 @@ export interface BoltColon extends SyntaxBase<SyntaxKind.BoltColon> {
|
||||||
kind: SyntaxKind.BoltColon;
|
kind: SyntaxKind.BoltColon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface BoltColonColon extends SyntaxBase<SyntaxKind.BoltColonColon> {
|
||||||
|
kind: SyntaxKind.BoltColonColon;
|
||||||
|
}
|
||||||
|
|
||||||
export interface BoltDot extends SyntaxBase<SyntaxKind.BoltDot> {
|
export interface BoltDot extends SyntaxBase<SyntaxKind.BoltDot> {
|
||||||
kind: SyntaxKind.BoltDot;
|
kind: SyntaxKind.BoltDot;
|
||||||
}
|
}
|
||||||
|
@ -365,10 +398,18 @@ export interface BoltGtSign extends SyntaxBase<SyntaxKind.BoltGtSign> {
|
||||||
kind: SyntaxKind.BoltGtSign;
|
kind: SyntaxKind.BoltGtSign;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface BoltExMark extends SyntaxBase<SyntaxKind.BoltExMark> {
|
||||||
|
kind: SyntaxKind.BoltExMark;
|
||||||
|
}
|
||||||
|
|
||||||
export interface BoltLtSign extends SyntaxBase<SyntaxKind.BoltLtSign> {
|
export interface BoltLtSign extends SyntaxBase<SyntaxKind.BoltLtSign> {
|
||||||
kind: SyntaxKind.BoltLtSign;
|
kind: SyntaxKind.BoltLtSign;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface BoltVBar extends SyntaxBase<SyntaxKind.BoltVBar> {
|
||||||
|
kind: SyntaxKind.BoltVBar;
|
||||||
|
}
|
||||||
|
|
||||||
export type BoltKeyword
|
export type BoltKeyword
|
||||||
= BoltQuoteKeyword
|
= BoltQuoteKeyword
|
||||||
| BoltFnKeyword
|
| BoltFnKeyword
|
||||||
|
@ -569,6 +610,7 @@ export interface BoltRecordPattern extends SyntaxBase<SyntaxKind.BoltRecordPatte
|
||||||
export type BoltExpression
|
export type BoltExpression
|
||||||
= BoltQuoteExpression
|
= BoltQuoteExpression
|
||||||
| BoltReferenceExpression
|
| BoltReferenceExpression
|
||||||
|
| BoltFunctionExpression
|
||||||
| BoltCallExpression
|
| BoltCallExpression
|
||||||
| BoltYieldExpression
|
| BoltYieldExpression
|
||||||
| BoltMatchExpression
|
| BoltMatchExpression
|
||||||
|
@ -588,6 +630,13 @@ export interface BoltReferenceExpression extends SyntaxBase<SyntaxKind.BoltRefer
|
||||||
name: BoltQualName;
|
name: BoltQualName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface BoltFunctionExpression extends SyntaxBase<SyntaxKind.BoltFunctionExpression> {
|
||||||
|
kind: SyntaxKind.BoltFunctionExpression;
|
||||||
|
params: BoltParameter[];
|
||||||
|
returnType: BoltTypeExpression | null;
|
||||||
|
body: BoltFunctionBodyElement[];
|
||||||
|
}
|
||||||
|
|
||||||
export interface BoltCallExpression extends SyntaxBase<SyntaxKind.BoltCallExpression> {
|
export interface BoltCallExpression extends SyntaxBase<SyntaxKind.BoltCallExpression> {
|
||||||
kind: SyntaxKind.BoltCallExpression;
|
kind: SyntaxKind.BoltCallExpression;
|
||||||
operator: BoltExpression;
|
operator: BoltExpression;
|
||||||
|
@ -1226,6 +1275,7 @@ export type BoltSyntax
|
||||||
| BoltComma
|
| BoltComma
|
||||||
| BoltSemi
|
| BoltSemi
|
||||||
| BoltColon
|
| BoltColon
|
||||||
|
| BoltColonColon
|
||||||
| BoltDot
|
| BoltDot
|
||||||
| BoltDotDot
|
| BoltDotDot
|
||||||
| BoltRArrow
|
| BoltRArrow
|
||||||
|
@ -1233,7 +1283,9 @@ export type BoltSyntax
|
||||||
| BoltLArrow
|
| BoltLArrow
|
||||||
| BoltEqSign
|
| BoltEqSign
|
||||||
| BoltGtSign
|
| BoltGtSign
|
||||||
|
| BoltExMark
|
||||||
| BoltLtSign
|
| BoltLtSign
|
||||||
|
| BoltVBar
|
||||||
| BoltQuoteKeyword
|
| BoltQuoteKeyword
|
||||||
| BoltFnKeyword
|
| BoltFnKeyword
|
||||||
| BoltForeignKeyword
|
| BoltForeignKeyword
|
||||||
|
@ -1269,6 +1321,7 @@ export type BoltSyntax
|
||||||
| BoltRecordPattern
|
| BoltRecordPattern
|
||||||
| BoltQuoteExpression
|
| BoltQuoteExpression
|
||||||
| BoltReferenceExpression
|
| BoltReferenceExpression
|
||||||
|
| BoltFunctionExpression
|
||||||
| BoltCallExpression
|
| BoltCallExpression
|
||||||
| BoltYieldExpression
|
| BoltYieldExpression
|
||||||
| BoltMatchArm
|
| BoltMatchArm
|
||||||
|
@ -1373,6 +1426,7 @@ export type Syntax
|
||||||
| BoltComma
|
| BoltComma
|
||||||
| BoltSemi
|
| BoltSemi
|
||||||
| BoltColon
|
| BoltColon
|
||||||
|
| BoltColonColon
|
||||||
| BoltDot
|
| BoltDot
|
||||||
| BoltDotDot
|
| BoltDotDot
|
||||||
| BoltRArrow
|
| BoltRArrow
|
||||||
|
@ -1380,7 +1434,9 @@ export type Syntax
|
||||||
| BoltLArrow
|
| BoltLArrow
|
||||||
| BoltEqSign
|
| BoltEqSign
|
||||||
| BoltGtSign
|
| BoltGtSign
|
||||||
|
| BoltExMark
|
||||||
| BoltLtSign
|
| BoltLtSign
|
||||||
|
| BoltVBar
|
||||||
| BoltQuoteKeyword
|
| BoltQuoteKeyword
|
||||||
| BoltFnKeyword
|
| BoltFnKeyword
|
||||||
| BoltForeignKeyword
|
| BoltForeignKeyword
|
||||||
|
@ -1416,6 +1472,7 @@ export type Syntax
|
||||||
| BoltRecordPattern
|
| BoltRecordPattern
|
||||||
| BoltQuoteExpression
|
| BoltQuoteExpression
|
||||||
| BoltReferenceExpression
|
| BoltReferenceExpression
|
||||||
|
| BoltFunctionExpression
|
||||||
| BoltCallExpression
|
| BoltCallExpression
|
||||||
| BoltYieldExpression
|
| BoltYieldExpression
|
||||||
| BoltMatchArm
|
| BoltMatchArm
|
||||||
|
@ -1518,6 +1575,7 @@ export function createBoltAssignment(operator: string | null, span?: TextSpan |
|
||||||
export function createBoltComma(span?: TextSpan | null): BoltComma;
|
export function createBoltComma(span?: TextSpan | null): BoltComma;
|
||||||
export function createBoltSemi(span?: TextSpan | null): BoltSemi;
|
export function createBoltSemi(span?: TextSpan | null): BoltSemi;
|
||||||
export function createBoltColon(span?: TextSpan | null): BoltColon;
|
export function createBoltColon(span?: TextSpan | null): BoltColon;
|
||||||
|
export function createBoltColonColon(span?: TextSpan | null): BoltColonColon;
|
||||||
export function createBoltDot(span?: TextSpan | null): BoltDot;
|
export function createBoltDot(span?: TextSpan | null): BoltDot;
|
||||||
export function createBoltDotDot(span?: TextSpan | null): BoltDotDot;
|
export function createBoltDotDot(span?: TextSpan | null): BoltDotDot;
|
||||||
export function createBoltRArrow(span?: TextSpan | null): BoltRArrow;
|
export function createBoltRArrow(span?: TextSpan | null): BoltRArrow;
|
||||||
|
@ -1525,7 +1583,9 @@ export function createBoltRArrowAlt(span?: TextSpan | null): BoltRArrowAlt;
|
||||||
export function createBoltLArrow(span?: TextSpan | null): BoltLArrow;
|
export function createBoltLArrow(span?: TextSpan | null): BoltLArrow;
|
||||||
export function createBoltEqSign(span?: TextSpan | null): BoltEqSign;
|
export function createBoltEqSign(span?: TextSpan | null): BoltEqSign;
|
||||||
export function createBoltGtSign(span?: TextSpan | null): BoltGtSign;
|
export function createBoltGtSign(span?: TextSpan | null): BoltGtSign;
|
||||||
|
export function createBoltExMark(span?: TextSpan | null): BoltExMark;
|
||||||
export function createBoltLtSign(span?: TextSpan | null): BoltLtSign;
|
export function createBoltLtSign(span?: TextSpan | null): BoltLtSign;
|
||||||
|
export function createBoltVBar(span?: TextSpan | null): BoltVBar;
|
||||||
export function createBoltQuoteKeyword(span?: TextSpan | null): BoltQuoteKeyword;
|
export function createBoltQuoteKeyword(span?: TextSpan | null): BoltQuoteKeyword;
|
||||||
export function createBoltFnKeyword(span?: TextSpan | null): BoltFnKeyword;
|
export function createBoltFnKeyword(span?: TextSpan | null): BoltFnKeyword;
|
||||||
export function createBoltForeignKeyword(span?: TextSpan | null): BoltForeignKeyword;
|
export function createBoltForeignKeyword(span?: TextSpan | null): BoltForeignKeyword;
|
||||||
|
@ -1561,6 +1621,7 @@ export function createBoltRecordFieldPattern(isRest: boolean, name: BoltIdentifi
|
||||||
export function createBoltRecordPattern(name: BoltQualName, fields: BoltRecordFieldPattern[], span?: TextSpan | null): BoltRecordPattern;
|
export function createBoltRecordPattern(name: BoltQualName, fields: BoltRecordFieldPattern[], span?: TextSpan | null): BoltRecordPattern;
|
||||||
export function createBoltQuoteExpression(tokens: Token[], span?: TextSpan | null): BoltQuoteExpression;
|
export function createBoltQuoteExpression(tokens: Token[], span?: TextSpan | null): BoltQuoteExpression;
|
||||||
export function createBoltReferenceExpression(name: BoltQualName, span?: TextSpan | null): BoltReferenceExpression;
|
export function createBoltReferenceExpression(name: BoltQualName, span?: TextSpan | null): BoltReferenceExpression;
|
||||||
|
export function createBoltFunctionExpression(params: BoltParameter[], returnType: BoltTypeExpression | null, body: BoltFunctionBodyElement[], span?: TextSpan | null): BoltFunctionExpression;
|
||||||
export function createBoltCallExpression(operator: BoltExpression, operands: BoltExpression[], span?: TextSpan | null): BoltCallExpression;
|
export function createBoltCallExpression(operator: BoltExpression, operands: BoltExpression[], span?: TextSpan | null): BoltCallExpression;
|
||||||
export function createBoltYieldExpression(value: BoltExpression, span?: TextSpan | null): BoltYieldExpression;
|
export function createBoltYieldExpression(value: BoltExpression, span?: TextSpan | null): BoltYieldExpression;
|
||||||
export function createBoltMatchArm(pattern: BoltPattern, body: BoltExpression, span?: TextSpan | null): BoltMatchArm;
|
export function createBoltMatchArm(pattern: BoltPattern, body: BoltExpression, span?: TextSpan | null): BoltMatchArm;
|
||||||
|
@ -1659,11 +1720,13 @@ export function isBoltStringLiteral(value: any): value is BoltStringLiteral;
|
||||||
export function isBoltIntegerLiteral(value: any): value is BoltIntegerLiteral;
|
export function isBoltIntegerLiteral(value: any): value is BoltIntegerLiteral;
|
||||||
export function isBoltSymbol(value: any): value is BoltSymbol;
|
export function isBoltSymbol(value: any): value is BoltSymbol;
|
||||||
export function isBoltIdentifier(value: any): value is BoltIdentifier;
|
export function isBoltIdentifier(value: any): value is BoltIdentifier;
|
||||||
|
export function isBoltOperatorLike(value: any): value is BoltOperatorLike;
|
||||||
export function isBoltOperator(value: any): value is BoltOperator;
|
export function isBoltOperator(value: any): value is BoltOperator;
|
||||||
export function isBoltAssignment(value: any): value is BoltAssignment;
|
export function isBoltAssignment(value: any): value is BoltAssignment;
|
||||||
export function isBoltComma(value: any): value is BoltComma;
|
export function isBoltComma(value: any): value is BoltComma;
|
||||||
export function isBoltSemi(value: any): value is BoltSemi;
|
export function isBoltSemi(value: any): value is BoltSemi;
|
||||||
export function isBoltColon(value: any): value is BoltColon;
|
export function isBoltColon(value: any): value is BoltColon;
|
||||||
|
export function isBoltColonColon(value: any): value is BoltColonColon;
|
||||||
export function isBoltDot(value: any): value is BoltDot;
|
export function isBoltDot(value: any): value is BoltDot;
|
||||||
export function isBoltDotDot(value: any): value is BoltDotDot;
|
export function isBoltDotDot(value: any): value is BoltDotDot;
|
||||||
export function isBoltRArrow(value: any): value is BoltRArrow;
|
export function isBoltRArrow(value: any): value is BoltRArrow;
|
||||||
|
@ -1671,7 +1734,9 @@ export function isBoltRArrowAlt(value: any): value is BoltRArrowAlt;
|
||||||
export function isBoltLArrow(value: any): value is BoltLArrow;
|
export function isBoltLArrow(value: any): value is BoltLArrow;
|
||||||
export function isBoltEqSign(value: any): value is BoltEqSign;
|
export function isBoltEqSign(value: any): value is BoltEqSign;
|
||||||
export function isBoltGtSign(value: any): value is BoltGtSign;
|
export function isBoltGtSign(value: any): value is BoltGtSign;
|
||||||
|
export function isBoltExMark(value: any): value is BoltExMark;
|
||||||
export function isBoltLtSign(value: any): value is BoltLtSign;
|
export function isBoltLtSign(value: any): value is BoltLtSign;
|
||||||
|
export function isBoltVBar(value: any): value is BoltVBar;
|
||||||
export function isBoltKeyword(value: any): value is BoltKeyword;
|
export function isBoltKeyword(value: any): value is BoltKeyword;
|
||||||
export function isBoltQuoteKeyword(value: any): value is BoltQuoteKeyword;
|
export function isBoltQuoteKeyword(value: any): value is BoltQuoteKeyword;
|
||||||
export function isBoltFnKeyword(value: any): value is BoltFnKeyword;
|
export function isBoltFnKeyword(value: any): value is BoltFnKeyword;
|
||||||
|
@ -1712,6 +1777,7 @@ export function isBoltRecordPattern(value: any): value is BoltRecordPattern;
|
||||||
export function isBoltExpression(value: any): value is BoltExpression;
|
export function isBoltExpression(value: any): value is BoltExpression;
|
||||||
export function isBoltQuoteExpression(value: any): value is BoltQuoteExpression;
|
export function isBoltQuoteExpression(value: any): value is BoltQuoteExpression;
|
||||||
export function isBoltReferenceExpression(value: any): value is BoltReferenceExpression;
|
export function isBoltReferenceExpression(value: any): value is BoltReferenceExpression;
|
||||||
|
export function isBoltFunctionExpression(value: any): value is BoltFunctionExpression;
|
||||||
export function isBoltCallExpression(value: any): value is BoltCallExpression;
|
export function isBoltCallExpression(value: any): value is BoltCallExpression;
|
||||||
export function isBoltYieldExpression(value: any): value is BoltYieldExpression;
|
export function isBoltYieldExpression(value: any): value is BoltYieldExpression;
|
||||||
export function isBoltMatchArm(value: any): value is BoltMatchArm;
|
export function isBoltMatchArm(value: any): value is BoltMatchArm;
|
||||||
|
|
|
@ -3,12 +3,37 @@ import { Syntax, SyntaxKind, kindToString } from "./ast"
|
||||||
|
|
||||||
export class Emitter {
|
export class Emitter {
|
||||||
|
|
||||||
emit(node: Syntax) {
|
public emit(node: Syntax) {
|
||||||
|
|
||||||
let out = '';
|
let out = '';
|
||||||
|
|
||||||
switch (node.kind) {
|
switch (node.kind) {
|
||||||
|
|
||||||
|
case SyntaxKind.BoltIdentifier:
|
||||||
|
case SyntaxKind.BoltOperator:
|
||||||
|
out += node.text;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SyntaxKind.BoltGtSign:
|
||||||
|
out += '>';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SyntaxKind.BoltLtSign:
|
||||||
|
out += '<';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SyntaxKind.BoltEqSign:
|
||||||
|
out += '=';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SyntaxKind.BoltVBar:
|
||||||
|
out += '|';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SyntaxKind.BoltExMark:
|
||||||
|
out += '!';
|
||||||
|
break;
|
||||||
|
|
||||||
case SyntaxKind.JSExpressionStatement:
|
case SyntaxKind.JSExpressionStatement:
|
||||||
out += this.emit(node.expression) + ';\n';
|
out += this.emit(node.expression) + ';\n';
|
||||||
break;
|
break;
|
||||||
|
@ -54,6 +79,7 @@ export class Emitter {
|
||||||
return out;
|
return out;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
121
src/parser.ts
121
src/parser.ts
|
@ -77,6 +77,11 @@ import {
|
||||||
BoltQuoteExpression,
|
BoltQuoteExpression,
|
||||||
BoltBlockExpression,
|
BoltBlockExpression,
|
||||||
createBoltBlockExpression,
|
createBoltBlockExpression,
|
||||||
|
isBoltOperatorLike,
|
||||||
|
BoltFunctionExpression,
|
||||||
|
createBoltFunctionExpression,
|
||||||
|
BoltMacroCall,
|
||||||
|
createBoltMacroCall,
|
||||||
} from "./ast"
|
} from "./ast"
|
||||||
|
|
||||||
import { parseForeignLanguage } from "./foreign"
|
import { parseForeignLanguage } from "./foreign"
|
||||||
|
@ -112,6 +117,7 @@ const KIND_EXPRESSION_T0 = [
|
||||||
SyntaxKind.BoltIntegerLiteral,
|
SyntaxKind.BoltIntegerLiteral,
|
||||||
SyntaxKind.BoltIdentifier,
|
SyntaxKind.BoltIdentifier,
|
||||||
SyntaxKind.BoltOperator,
|
SyntaxKind.BoltOperator,
|
||||||
|
SyntaxKind.BoltVBar,
|
||||||
SyntaxKind.BoltMatchKeyword,
|
SyntaxKind.BoltMatchKeyword,
|
||||||
SyntaxKind.BoltQuoteKeyword,
|
SyntaxKind.BoltQuoteKeyword,
|
||||||
SyntaxKind.BoltYieldKeyword,
|
SyntaxKind.BoltYieldKeyword,
|
||||||
|
@ -146,6 +152,10 @@ const KIND_SOURCEELEMENT_T0 = uniq([
|
||||||
...KIND_DECLARATION_T0,
|
...KIND_DECLARATION_T0,
|
||||||
])
|
])
|
||||||
|
|
||||||
|
function isRightAssoc(kind: OperatorKind): boolean {
|
||||||
|
return kind === OperatorKind.InfixR;
|
||||||
|
}
|
||||||
|
|
||||||
export class Parser {
|
export class Parser {
|
||||||
|
|
||||||
exprOperatorTable = new OperatorTable([
|
exprOperatorTable = new OperatorTable([
|
||||||
|
@ -187,6 +197,31 @@ export class Parser {
|
||||||
return (this as any)['parse' + kindToString(kind).substring('Bolt'.length)](tokens);
|
return (this as any)['parse' + kindToString(kind).substring('Bolt'.length)](tokens);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public parseNamespacePath(tokens: BoltTokenStream): BoltQualName {
|
||||||
|
|
||||||
|
let modulePath = null;
|
||||||
|
|
||||||
|
if (tokens.peek(2).kind === SyntaxKind.BoltColonColon) {
|
||||||
|
modulePath = [];
|
||||||
|
while (true) {
|
||||||
|
modulePath.push(tokens.get() as BoltIdentifier)
|
||||||
|
tokens.get();
|
||||||
|
const t0 = tokens.peek(2);
|
||||||
|
if (t0.kind !== SyntaxKind.BoltColonColon) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const name = tokens.get();
|
||||||
|
assertToken(name, SyntaxKind.BoltIdentifier);
|
||||||
|
const startNode = modulePath !== null ? modulePath[0] : name;
|
||||||
|
const endNode = name;
|
||||||
|
const node = createBoltQualName(modulePath, name as BoltIdentifier, null);
|
||||||
|
setOrigNodeRange(node, startNode, endNode);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
public parseQualName(tokens: BoltTokenStream): BoltQualName {
|
public parseQualName(tokens: BoltTokenStream): BoltQualName {
|
||||||
|
|
||||||
let modulePath = null;
|
let modulePath = null;
|
||||||
|
@ -222,7 +257,7 @@ export class Parser {
|
||||||
|
|
||||||
public parseRecordPattern(tokens: BoltTokenStream): BoltRecordPattern {
|
public parseRecordPattern(tokens: BoltTokenStream): BoltRecordPattern {
|
||||||
|
|
||||||
const name = this.parseQualName(tokens);
|
const name = this.parseNamespacePath(tokens);
|
||||||
const t1 = tokens.get();
|
const t1 = tokens.get();
|
||||||
assertToken(t1, SyntaxKind.BoltBraced);
|
assertToken(t1, SyntaxKind.BoltBraced);
|
||||||
|
|
||||||
|
@ -345,7 +380,7 @@ export class Parser {
|
||||||
|
|
||||||
public parseReferenceTypeExpression(tokens: BoltTokenStream): BoltReferenceTypeExpression {
|
public parseReferenceTypeExpression(tokens: BoltTokenStream): BoltReferenceTypeExpression {
|
||||||
|
|
||||||
const name = this.parseQualName(tokens)
|
const name = this.parseNamespacePath(tokens)
|
||||||
|
|
||||||
const t1 = tokens.peek();
|
const t1 = tokens.peek();
|
||||||
|
|
||||||
|
@ -391,10 +426,10 @@ export class Parser {
|
||||||
private parseTypeExpressionOperators(tokens: BoltTokenStream, lhs: BoltTypeExpression, minPrecedence: number): BoltTypeExpression {
|
private parseTypeExpressionOperators(tokens: BoltTokenStream, lhs: BoltTypeExpression, minPrecedence: number): BoltTypeExpression {
|
||||||
while (true) {
|
while (true) {
|
||||||
const t0 = tokens.peek();
|
const t0 = tokens.peek();
|
||||||
if (t0.kind !== SyntaxKind.BoltOperator) {
|
if (!isBoltOperatorLike(t0)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
let desc0 = this.typeOperatorTable.lookup(t0.text);
|
let desc0 = this.typeOperatorTable.lookup(emit(t0));
|
||||||
if (desc0 === null || desc0.arity !== 2 || desc0.precedence < minPrecedence) {
|
if (desc0 === null || desc0.arity !== 2 || desc0.precedence < minPrecedence) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -403,10 +438,10 @@ export class Parser {
|
||||||
let rhs = this.parsePrimTypeExpression(tokens);
|
let rhs = this.parsePrimTypeExpression(tokens);
|
||||||
while (true) {
|
while (true) {
|
||||||
const t1 = tokens.peek()
|
const t1 = tokens.peek()
|
||||||
if (t1.kind !== SyntaxKind.BoltOperator) {
|
if (!isBoltOperatorLike(t1.kind)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
const desc1 = this.typeOperatorTable.lookup(t1.text)
|
const desc1 = this.typeOperatorTable.lookup(emit(t1))
|
||||||
if (desc1 === null || desc1.arity !== 2 || desc1.precedence < desc0.precedence || !isRightAssoc(desc1.kind)) {
|
if (desc1 === null || desc1.arity !== 2 || desc1.precedence < desc0.precedence || !isRightAssoc(desc1.kind)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -440,8 +475,43 @@ export class Parser {
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public parseFunctionExpression(tokens: BoltTokenStream): BoltFunctionExpression {
|
||||||
|
const t0 = tokens.get();
|
||||||
|
assertToken(t0, SyntaxKind.BoltVBar);
|
||||||
|
let i = 0;
|
||||||
|
const params: BoltParameter[] = [];
|
||||||
|
while (true) {
|
||||||
|
const t1 = tokens.peek();
|
||||||
|
if (t1.kind === SyntaxKind.BoltVBar) {
|
||||||
|
tokens.get();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const param = this.parseParameter(tokens, i++);
|
||||||
|
params.push(param);
|
||||||
|
const t2 = tokens.peek();
|
||||||
|
if (t2.kind === SyntaxKind.BoltVBar) {
|
||||||
|
tokens.get();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const t3 = tokens.get();
|
||||||
|
assertToken(t3, SyntaxKind.BoltComma);
|
||||||
|
}
|
||||||
|
let returnType = null;
|
||||||
|
let t4 = tokens.get();
|
||||||
|
if (t4.kind === SyntaxKind.BoltRArrow) {
|
||||||
|
returnType = this.parseTypeExpression(tokens);
|
||||||
|
t4 = tokens.get();
|
||||||
|
}
|
||||||
|
assertToken(t4, SyntaxKind.BoltBraced);
|
||||||
|
const innerTokens = createTokenStream(t4);
|
||||||
|
const body = this.parseFunctionBodyElements(innerTokens);
|
||||||
|
const result = createBoltFunctionExpression(params, returnType, body);
|
||||||
|
setOrigNodeRange(result, t0, t4);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public parseReferenceExpression(tokens: BoltTokenStream): BoltReferenceExpression {
|
public parseReferenceExpression(tokens: BoltTokenStream): BoltReferenceExpression {
|
||||||
const name = this.parseQualName(tokens);
|
const name = this.parseNamespacePath(tokens);
|
||||||
const node = createBoltReferenceExpression(name);
|
const node = createBoltReferenceExpression(name);
|
||||||
setOrigNodeRange(node, name, name);
|
setOrigNodeRange(node, name, name);
|
||||||
return node;
|
return node;
|
||||||
|
@ -526,7 +596,9 @@ export class Parser {
|
||||||
|
|
||||||
private parsePrimitiveExpression(tokens: BoltTokenStream): BoltExpression {
|
private parsePrimitiveExpression(tokens: BoltTokenStream): BoltExpression {
|
||||||
const t0 = tokens.peek();
|
const t0 = tokens.peek();
|
||||||
if (t0.kind === SyntaxKind.BoltBraced) {
|
if (t0.kind === SyntaxKind.BoltVBar) {
|
||||||
|
return this.parseFunctionExpression(tokens);
|
||||||
|
} else if (t0.kind === SyntaxKind.BoltBraced) {
|
||||||
return this.parseBlockExpression(tokens);
|
return this.parseBlockExpression(tokens);
|
||||||
} else if (t0.kind === SyntaxKind.BoltQuoteKeyword) {
|
} else if (t0.kind === SyntaxKind.BoltQuoteKeyword) {
|
||||||
return this.parseQuoteExpression(tokens);
|
return this.parseQuoteExpression(tokens);
|
||||||
|
@ -649,6 +721,9 @@ export class Parser {
|
||||||
}
|
}
|
||||||
|
|
||||||
public parseStatement(tokens: BoltTokenStream): BoltStatement {
|
public parseStatement(tokens: BoltTokenStream): BoltStatement {
|
||||||
|
if (this.lookaheadIsMacroCall(tokens)) {
|
||||||
|
return this.parseMacroCall(tokens);
|
||||||
|
}
|
||||||
const t0 = tokens.peek();
|
const t0 = tokens.peek();
|
||||||
if (KIND_EXPRESSION_T0.indexOf(t0.kind) !== -1) {
|
if (KIND_EXPRESSION_T0.indexOf(t0.kind) !== -1) {
|
||||||
return this.parseExpressionStatement(tokens);
|
return this.parseExpressionStatement(tokens);
|
||||||
|
@ -807,7 +882,7 @@ export class Parser {
|
||||||
throw new ParseError(t0, [SyntaxKind.BoltModKeyword])
|
throw new ParseError(t0, [SyntaxKind.BoltModKeyword])
|
||||||
}
|
}
|
||||||
|
|
||||||
const name = this.parseQualName(tokens);
|
const name = this.parseNamespacePath(tokens);
|
||||||
|
|
||||||
const t1 = tokens.get();
|
const t1 = tokens.get();
|
||||||
if (t1.kind !== SyntaxKind.BoltBraced) {
|
if (t1.kind !== SyntaxKind.BoltBraced) {
|
||||||
|
@ -1133,15 +1208,26 @@ export class Parser {
|
||||||
return t0;
|
return t0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private lookaheadIsMacroCall(tokens: BoltTokenStream): boolean {
|
||||||
|
return tokens.peek(1).kind === SyntaxKind.BoltIdentifier
|
||||||
|
&& tokens.peek(2).kind === SyntaxKind.BoltExMark;
|
||||||
|
}
|
||||||
|
|
||||||
public parseSourceElement(tokens: BoltTokenStream): BoltSourceElement {
|
public parseSourceElement(tokens: BoltTokenStream): BoltSourceElement {
|
||||||
|
if (this.lookaheadIsMacroCall(tokens)) {
|
||||||
|
return this.parseMacroCall(tokens);
|
||||||
|
}
|
||||||
const t0 = this.getFirstTokenAfterModifiers(tokens);
|
const t0 = this.getFirstTokenAfterModifiers(tokens);
|
||||||
if (KIND_STATEMENT_T0.indexOf(t0.kind) !== -1) {
|
if (KIND_STATEMENT_T0.indexOf(t0.kind) !== -1) {
|
||||||
return this.parseStatement(tokens);
|
return this.parseStatement(tokens);
|
||||||
}
|
}
|
||||||
return this.parseDeclaration(tokens)
|
return this.parseDeclaration(tokens);
|
||||||
}
|
}
|
||||||
|
|
||||||
public parseFunctionBodyElement(tokens: BoltTokenStream): BoltFunctionBodyElement {
|
public parseFunctionBodyElement(tokens: BoltTokenStream): BoltFunctionBodyElement {
|
||||||
|
if (this.lookaheadIsMacroCall(tokens)) {
|
||||||
|
return this.parseMacroCall(tokens);
|
||||||
|
}
|
||||||
const t0 = this.getFirstTokenAfterModifiers(tokens);
|
const t0 = this.getFirstTokenAfterModifiers(tokens);
|
||||||
if (KIND_STATEMENT_T0.indexOf(t0.kind) !== -1) {
|
if (KIND_STATEMENT_T0.indexOf(t0.kind) !== -1) {
|
||||||
return this.parseStatement(tokens);
|
return this.parseStatement(tokens);
|
||||||
|
@ -1154,6 +1240,20 @@ export class Parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public parseMacroCall(tokens: BoltTokenStream): BoltMacroCall {
|
||||||
|
const t0 = tokens.get();
|
||||||
|
assertToken(t0, SyntaxKind.BoltIdentifier);
|
||||||
|
const t1 = tokens.get();
|
||||||
|
assertToken(t1, SyntaxKind.BoltExMark);
|
||||||
|
const t2 = tokens.get();
|
||||||
|
if (!isBoltPunctuated(t2)) {
|
||||||
|
throw new ParseError(t2, [SyntaxKind.BoltBraced, SyntaxKind.BoltParenthesized, SyntaxKind.BoltBracketed]);
|
||||||
|
}
|
||||||
|
const result = createBoltMacroCall(t0 as BoltIdentifier, t2.text);
|
||||||
|
setOrigNodeRange(result, t0, t2);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public parseFunctionBodyElements(tokens: BoltTokenStream): BoltFunctionBodyElement[] {
|
public parseFunctionBodyElements(tokens: BoltTokenStream): BoltFunctionBodyElement[] {
|
||||||
const elements: BoltFunctionBodyElement[] = []
|
const elements: BoltFunctionBodyElement[] = []
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -1389,6 +1489,7 @@ import { Scanner } from "./scanner"
|
||||||
import { TextFile, TextSpan, TextPos } from "./text"
|
import { TextFile, TextSpan, TextPos } from "./text"
|
||||||
import * as fs from "fs"
|
import * as fs from "fs"
|
||||||
import {JSScanner} from "./foreign/js/scanner";
|
import {JSScanner} from "./foreign/js/scanner";
|
||||||
|
import {emit} from "./emitter";
|
||||||
|
|
||||||
export function parseSourceFile(filepath: string): BoltSourceFile {
|
export function parseSourceFile(filepath: string): BoltSourceFile {
|
||||||
const file = new TextFile(filepath);
|
const file = new TextFile(filepath);
|
||||||
|
|
|
@ -48,6 +48,9 @@ import {
|
||||||
createBoltMatchKeyword,
|
createBoltMatchKeyword,
|
||||||
createBoltQuoteKeyword,
|
createBoltQuoteKeyword,
|
||||||
createBoltLetKeyword,
|
createBoltLetKeyword,
|
||||||
|
createBoltVBar,
|
||||||
|
createBoltColonColon,
|
||||||
|
createBoltExMark,
|
||||||
} from "./ast"
|
} from "./ast"
|
||||||
|
|
||||||
export enum PunctType {
|
export enum PunctType {
|
||||||
|
@ -210,6 +213,10 @@ export class Scanner {
|
||||||
return createBoltComma(new TextSpan(this.file, startPos, this.currPos.clone()));
|
return createBoltComma(new TextSpan(this.file, startPos, this.currPos.clone()));
|
||||||
case ':':
|
case ':':
|
||||||
this.getChar();
|
this.getChar();
|
||||||
|
if (this.peekChar() === ':') {
|
||||||
|
this.getChar();
|
||||||
|
return createBoltColonColon(new TextSpan(this.file, startPos, this.currPos.clone()));
|
||||||
|
}
|
||||||
return createBoltColon(new TextSpan(this.file, startPos, this.currPos.clone()));
|
return createBoltColon(new TextSpan(this.file, startPos, this.currPos.clone()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,6 +325,8 @@ export class Scanner {
|
||||||
const span = new TextSpan(this.file, startPos, endPos);
|
const span = new TextSpan(this.file, startPos, endPos);
|
||||||
|
|
||||||
switch (text) {
|
switch (text) {
|
||||||
|
case '!': return createBoltExMark(span);
|
||||||
|
case '|': return createBoltVBar(span);
|
||||||
case '->': return createBoltRArrow(span);
|
case '->': return createBoltRArrow(span);
|
||||||
case '=>': return createBoltRArrowAlt(span);
|
case '=>': return createBoltRArrowAlt(span);
|
||||||
case '<-': return createBoltLArrow(span);
|
case '<-': return createBoltLArrow(span);
|
||||||
|
|
|
@ -237,6 +237,8 @@ export function getFileStem(filepath: string): string {
|
||||||
|
|
||||||
export function describeKind(kind: SyntaxKind): string {
|
export function describeKind(kind: SyntaxKind): string {
|
||||||
switch (kind) {
|
switch (kind) {
|
||||||
|
case SyntaxKind.BoltExMark:
|
||||||
|
return "'!'";
|
||||||
case SyntaxKind.JSIdentifier:
|
case SyntaxKind.JSIdentifier:
|
||||||
return "a JavaScript identifier"
|
return "a JavaScript identifier"
|
||||||
case SyntaxKind.BoltIdentifier:
|
case SyntaxKind.BoltIdentifier:
|
||||||
|
@ -269,6 +271,8 @@ export function describeKind(kind: SyntaxKind): string {
|
||||||
return "';'"
|
return "';'"
|
||||||
case SyntaxKind.BoltColon:
|
case SyntaxKind.BoltColon:
|
||||||
return "':'"
|
return "':'"
|
||||||
|
case SyntaxKind.BoltColonColon:
|
||||||
|
return "'::'";
|
||||||
case SyntaxKind.BoltDot:
|
case SyntaxKind.BoltDot:
|
||||||
return "'.'"
|
return "'.'"
|
||||||
case SyntaxKind.JSDot:
|
case SyntaxKind.JSDot:
|
||||||
|
@ -277,6 +281,8 @@ export function describeKind(kind: SyntaxKind): string {
|
||||||
return "'...'"
|
return "'...'"
|
||||||
case SyntaxKind.BoltRArrow:
|
case SyntaxKind.BoltRArrow:
|
||||||
return "'->'"
|
return "'->'"
|
||||||
|
case SyntaxKind.BoltVBar:
|
||||||
|
return "'|'";
|
||||||
case SyntaxKind.BoltComma:
|
case SyntaxKind.BoltComma:
|
||||||
return "','"
|
return "','"
|
||||||
case SyntaxKind.BoltModKeyword:
|
case SyntaxKind.BoltModKeyword:
|
||||||
|
|
Loading…
Reference in a new issue