diff --git a/baselines/reference/es6.grammar.emu.html b/baselines/reference/es6.grammar.emu.html index 1a54490..5659b61 100644 --- a/baselines/reference/es6.grammar.emu.html +++ b/baselines/reference/es6.grammar.emu.html @@ -352,9 +352,9 @@ CharacterEscapeSequence - + 0 - lookahead ≠ DecimalDigit + lookahead ∉ DecimalDigit HexEscapeSequence UnicodeEscapeSequence diff --git a/baselines/reference/es6.grammar.html b/baselines/reference/es6.grammar.html index 68773fc..3d0002b 100644 --- a/baselines/reference/es6.grammar.html +++ b/baselines/reference/es6.grammar.html @@ -632,7 +632,7 @@ CharacterEscapeSequence
- 0 [lookaheadDecimalDigit] + 0 [lookaheadDecimalDigit]
HexEscapeSequence diff --git a/baselines/reference/es6.grammar.md b/baselines/reference/es6.grammar.md index 6c2bb77..c83cff6 100644 --- a/baselines/reference/es6.grammar.md +++ b/baselines/reference/es6.grammar.md @@ -251,7 +251,7 @@   *EscapeSequence* **::**    *[CharacterEscapeSequence](#CharacterEscapeSequence)* -   `` 0 `` [lookahead ≠ *[DecimalDigit](#DecimalDigit)*] +   `` 0 `` [lookahead ∉ *[DecimalDigit](#DecimalDigit)*]    *[HexEscapeSequence](#HexEscapeSequence)*    *[UnicodeEscapeSequence](#UnicodeEscapeSequence)* diff --git a/baselines/reference/es6.grammar.nodes b/baselines/reference/es6.grammar.nodes index 59322a8..5d0ebd0 100644 --- a/baselines/reference/es6.grammar.nodes +++ b/baselines/reference/es6.grammar.nodes @@ -1055,7 +1055,7 @@ (265,6)SyntaxKind[LookaheadAssertion] (265,6)SyntaxKind[OpenBracketToken] (265,7)SyntaxKind[LookaheadKeyword] - (265,17)SyntaxKind[ExclamationEqualsToken] + (265,17)SyntaxKind[LessThanExclamationToken] (265,20)SyntaxKind[SymbolSpan] (265,20)SyntaxKind[Nonterminal] (265,20)SyntaxKind[Identifier](text = "DecimalDigit") diff --git a/baselines/reference/es6.grammar.tokens b/baselines/reference/es6.grammar.tokens index 23ba79a..097ea05 100644 --- a/baselines/reference/es6.grammar.tokens +++ b/baselines/reference/es6.grammar.tokens @@ -873,7 +873,7 @@ SyntaxKind[LineTerminatorToken](265,1): «line terminator» SyntaxKind[Terminal](265,2): `0` SyntaxKind[OpenBracketToken](265,6): [ SyntaxKind[LookaheadKeyword](265,7): lookahead -SyntaxKind[ExclamationEqualsToken](265,17): != +SyntaxKind[LessThanExclamationToken](265,17): A B + + + lookahead ∉ A \ No newline at end of file diff --git a/baselines/reference/test.grammar.html b/baselines/reference/test.grammar.html index 4cf120c..9d461aa 100644 --- a/baselines/reference/test.grammar.html +++ b/baselines/reference/test.grammar.html @@ -64,4 +64,12 @@
+
+ LookaheadRestriction : +
+
+ [lookaheadA] +
+
+
\ No newline at end of file diff --git a/baselines/reference/test.grammar.md b/baselines/reference/test.grammar.md index 5249ae2..0545221 100644 --- a/baselines/reference/test.grammar.md +++ b/baselines/reference/test.grammar.md @@ -24,4 +24,7 @@   *Z* **:**    *[A](#A)*    *[B](#B)* + +  *LookaheadRestriction* **:** +   [lookahead ∉ *[A](#A)*] \ No newline at end of file diff --git a/baselines/reference/test.grammar.nodes b/baselines/reference/test.grammar.nodes index 61207a7..14256ad 100644 --- a/baselines/reference/test.grammar.nodes +++ b/baselines/reference/test.grammar.nodes @@ -174,3 +174,18 @@ (22,10)SyntaxKind[Nonterminal] (22,10)SyntaxKind[Identifier](text = "B") (23,1)SyntaxKind[DedentToken] + (24,1)SyntaxKind[Production] + (24,1)SyntaxKind[Identifier](text = "LookaheadRestriction") + (25,1)SyntaxKind[RightHandSideList] + (25,1)SyntaxKind[IndentToken] + (25,5)SyntaxKind[RightHandSide] + (25,5)SyntaxKind[SymbolSpan] + (25,5)SyntaxKind[LookaheadAssertion] + (25,5)SyntaxKind[OpenBracketToken] + (25,6)SyntaxKind[LookaheadKeyword] + (25,16)SyntaxKind[LessThanExclamationToken] + (25,19)SyntaxKind[SymbolSpan] + (25,19)SyntaxKind[Nonterminal] + (25,19)SyntaxKind[Identifier](text = "A") + (25,20)SyntaxKind[CloseBracketToken] + (25,21)SyntaxKind[DedentToken] diff --git a/baselines/reference/test.grammar.tokens b/baselines/reference/test.grammar.tokens index 026c505..0d3b949 100644 --- a/baselines/reference/test.grammar.tokens +++ b/baselines/reference/test.grammar.tokens @@ -118,4 +118,15 @@ SyntaxKind[LineTerminatorToken](22,1): «line terminator» SyntaxKind[Identifier](22,10): B SyntaxKind[LineTerminatorToken](23,1): «line terminator» SyntaxKind[DedentToken](23,1): «dedent» -SyntaxKind[EndOfFileToken](23,1): «EndOfFileToken» +SyntaxKind[LineTerminatorToken](24,1): «line terminator» +SyntaxKind[Identifier](24,1): LookaheadRestriction +SyntaxKind[ColonToken](24,21): : +SyntaxKind[LineTerminatorToken](25,1): «line terminator» +SyntaxKind[IndentToken](25,1): «indent» +SyntaxKind[OpenBracketToken](25,5): [ +SyntaxKind[LookaheadKeyword](25,6): lookahead +SyntaxKind[LessThanExclamationToken](25,16): A B + +LookaheadRestriction: + [lookahead implements TextRange { + public kind: TKind; public id: number = ++nextNodeId; public pos: number; public end: number; private _edges: NodeEdge[]; - constructor(kind: SyntaxKind) { + constructor(kind: TKind) { this.kind = kind; } @@ -65,7 +65,7 @@ export class Node implements TextRange { } } -export class StringLiteral extends Node implements TextContent { +export class StringLiteral extends Node implements TextContent { public text: string; constructor(text: string) { @@ -75,7 +75,7 @@ export class StringLiteral extends Node implements TextContent { } } -export class Identifier extends Node implements TextContent { +export class Identifier extends Node implements TextContent { public text: string; constructor(text: string) { @@ -85,16 +85,16 @@ export class Identifier extends Node implements TextContent { } } -export class LexicalSymbol extends Node { +export class LexicalSymbol extends Node { } -export class PrimarySymbol extends LexicalSymbol { +export class PrimarySymbol extends LexicalSymbol { } -export class OptionalSymbol extends PrimarySymbol { +export class OptionalSymbol extends PrimarySymbol { @edge questionToken: Node; - constructor(kind: SyntaxKind, questionToken: Node) { + constructor(kind: TKind, questionToken: Node) { super(kind); this.questionToken = questionToken; @@ -109,7 +109,7 @@ export class OptionalSymbol extends PrimarySymbol { } } -export class UnicodeCharacterLiteral extends OptionalSymbol implements TextContent { +export class UnicodeCharacterLiteral extends OptionalSymbol implements TextContent { public text: string; constructor(text: string, questionToken: Node) { @@ -119,7 +119,7 @@ export class UnicodeCharacterLiteral extends OptionalSymbol implements TextConte } } -export class UnicodeCharacterRange extends LexicalSymbol { +export class UnicodeCharacterRange extends LexicalSymbol { @edge left: UnicodeCharacterLiteral; @edge throughKeyword: Node; @edge right: UnicodeCharacterLiteral; @@ -132,7 +132,7 @@ export class UnicodeCharacterRange extends LexicalSymbol { } } -export class ButNotSymbol extends LexicalSymbol { +export class ButNotSymbol extends LexicalSymbol { @edge left: LexicalSymbol; @edge butKeyword: Node; @edge notKeyword: Node; @@ -147,7 +147,7 @@ export class ButNotSymbol extends LexicalSymbol { } } -export class Terminal extends OptionalSymbol implements TextContent { +export class Terminal extends OptionalSymbol implements TextContent { public text: string; constructor(text: string, questionToken: Node) { @@ -157,7 +157,7 @@ export class Terminal extends OptionalSymbol implements TextContent { } } -export class TerminalList extends Node { +export class TerminalList extends Node { @edge terminals: Terminal[]; constructor(terminals: Terminal[] = []) { @@ -167,7 +167,7 @@ export class TerminalList extends Node { } } -export class SymbolSet extends Node { +export class SymbolSet extends Node { @edge openBraceToken: Node; @edge elements: SymbolSpan[]; @edge closeBraceToken: Node; @@ -181,11 +181,11 @@ export class SymbolSet extends Node { } } -export class Assertion extends LexicalSymbol { +export class Assertion extends LexicalSymbol { @edge openBracketToken: Node; @edge closeBracketToken: Node; - constructor(kind: SyntaxKind, openBracketToken: Node, closeBracketToken: Node) { + constructor(kind: TKind, openBracketToken: Node, closeBracketToken: Node) { super(kind); this.openBracketToken = openBracketToken; @@ -193,7 +193,7 @@ export class Assertion extends LexicalSymbol { } } -export class EmptyAssertion extends Assertion { +export class EmptyAssertion extends Assertion { @edge openBracketToken: Node; @edge emptyKeyword: Node; @edge closeBracketToken: Node; @@ -205,7 +205,7 @@ export class EmptyAssertion extends Assertion { } } -export class LookaheadAssertion extends Assertion { +export class LookaheadAssertion extends Assertion { @edge openBracketToken: Node; @edge lookaheadKeyword: Node; @edge operatorToken: Node; @@ -221,7 +221,7 @@ export class LookaheadAssertion extends Assertion { } } -export class LexicalGoalAssertion extends Assertion { +export class LexicalGoalAssertion extends Assertion { @edge openBracketToken: Node; @edge lexicalKeyword: Node; @edge goalKeyword: Node; @@ -237,7 +237,7 @@ export class LexicalGoalAssertion extends Assertion { } } -export class NoSymbolHereAssertion extends Assertion { +export class NoSymbolHereAssertion extends Assertion { @edge openBracketToken: Node; @edge noKeyword: Node; @edge symbols: PrimarySymbol[]; @@ -253,7 +253,7 @@ export class NoSymbolHereAssertion extends Assertion { } } -export class ParameterValueAssertion extends Assertion { +export class ParameterValueAssertion extends Assertion { @edge openBracketToken: Node; @edge operatorToken: Node; @edge name: Identifier; @@ -267,7 +267,7 @@ export class ParameterValueAssertion extends Assertion { } } -export class ProseAssertion extends Assertion { +export class ProseAssertion extends Assertion { @edge openBracketToken: Node; @edge fragments: ProseFragment[]; @edge closeBracketToken: Node; @@ -278,7 +278,7 @@ export class ProseAssertion extends Assertion { } } -export class ProseFragmentLiteral extends Node implements TextContent { +export class ProseFragmentLiteral extends Node implements TextContent { text: string; constructor(kind: SyntaxKind, text: string) { @@ -289,7 +289,7 @@ export class ProseFragmentLiteral extends Node implements TextContent { export type ProseFragment = ProseFragmentLiteral | Terminal | Nonterminal; -export class Argument extends Node { +export class Argument extends Node { @edge operatorToken: Node; @edge name: Identifier; @@ -301,7 +301,7 @@ export class Argument extends Node { } } -export class ArgumentList extends Node { +export class ArgumentList extends Node { @edge openParenToken: Node; @edge elements: Argument[]; @edge closeParenToken: Node; @@ -315,7 +315,7 @@ export class ArgumentList extends Node { } } -export class Nonterminal extends OptionalSymbol { +export class Nonterminal extends OptionalSymbol { @edge name: Identifier; @edge argumentList: ArgumentList; @@ -327,7 +327,7 @@ export class Nonterminal extends OptionalSymbol { } } -export class Prose extends LexicalSymbol { +export class Prose extends LexicalSymbol { @edge greaterThanToken: Node; @edge fragments: ProseFragment[]; @@ -339,7 +339,7 @@ export class Prose extends LexicalSymbol { } } -export class OneOfSymbol extends LexicalSymbol { +export class OneOfSymbol extends LexicalSymbol { @edge oneKeyword: Node; @edge ofKeyword: Node; @edge symbols: LexicalSymbol[]; @@ -353,7 +353,7 @@ export class OneOfSymbol extends LexicalSymbol { } } -export class SymbolSpan extends Node { +export class SymbolSpan extends Node { @edge symbol: LexicalSymbol; @edge next: SymbolSpan; @@ -365,7 +365,7 @@ export class SymbolSpan extends Node { } } -export class LinkReference extends Node { +export class LinkReference extends Node { public text: string; constructor(text: string) { @@ -375,7 +375,7 @@ export class LinkReference extends Node { } } -export class RightHandSide extends Node { +export class RightHandSide extends Node { @edge head: SymbolSpan; @edge reference: LinkReference; @@ -387,7 +387,7 @@ export class RightHandSide extends Node { } } -export class RightHandSideList extends Node { +export class RightHandSideList extends Node { @edge openIndentToken: Node; @edge elements: RightHandSide[]; @edge closeIndentToken: Node; @@ -401,7 +401,7 @@ export class RightHandSideList extends Node { } } -export class OneOfList extends Node { +export class OneOfList extends Node { @edge openIndentToken: Node; @edge oneKeyword: Node; @edge ofKeyword: Node; @@ -419,7 +419,7 @@ export class OneOfList extends Node { } } -export class Parameter extends Node { +export class Parameter extends Node { @edge name: Identifier; constructor(name: Identifier) { @@ -429,7 +429,7 @@ export class Parameter extends Node { } } -export class ParameterList extends Node { +export class ParameterList extends Node { @edge openParenToken: Node; @edge elements: Parameter[]; @edge closeParenToken: Node; @@ -443,10 +443,10 @@ export class ParameterList extends Node { } } -export class SourceElement extends Node { +export class SourceElement extends Node { } -export class Production extends SourceElement { +export class Production extends SourceElement { @edge name: Identifier; @edge colonToken: Node; @edge parameterList: ParameterList; @@ -462,16 +462,16 @@ export class Production extends SourceElement { } } -export abstract class MetaElement extends SourceElement { +export abstract class MetaElement extends SourceElement { @edge atToken: Node; - constructor(kind: SyntaxKind, atToken: Node) { + constructor(kind: TKind, atToken: Node) { super(kind); this.atToken = atToken; } } -export class Import extends MetaElement { +export class Import extends MetaElement { @edge importKeyword: Node; @edge path: StringLiteral; @@ -482,7 +482,7 @@ export class Import extends MetaElement { } } -export class Define extends MetaElement { +export class Define extends MetaElement { @edge defineKeyword: Node; @edge key: Identifier; @edge valueToken: Node; @@ -495,7 +495,7 @@ export class Define extends MetaElement { } } -export class SourceFile extends Node { +export class SourceFile extends Node { public filename: string; public text: string; @edge elements: SourceElement[]; diff --git a/src/lib/tokens.ts b/src/lib/tokens.ts index 6e6890b..6f561f3 100644 --- a/src/lib/tokens.ts +++ b/src/lib/tokens.ts @@ -264,6 +264,16 @@ export enum SyntaxKind { LastPunctuation = LessThanMinusToken, } +export type ProseFragmentLiteralKinds = + | SyntaxKind.ProseFull + | SyntaxKind.ProseHead + | SyntaxKind.ProseMiddle + | SyntaxKind.ProseTail; + +export type MetaKinds = + | SyntaxKind.Import + | SyntaxKind.Define; + const textToToken = new Dictionary({ "but": SyntaxKind.ButKeyword, "define": SyntaxKind.DefineKeyword,