Add support in parser for even more nodes

This commit is contained in:
Sam Vervaeck 2020-05-24 21:03:15 +02:00
parent 1a349244a0
commit aad00c5024
6 changed files with 379 additions and 161 deletions

View file

@ -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
View file

@ -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;

View file

@ -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;
} }
} }
/** /**

View file

@ -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);

View file

@ -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);

View file

@ -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: