Index: petitparser/lib/src/dart/grammar.dart |
diff --git a/petitparser/lib/src/dart/grammar.dart b/petitparser/lib/src/dart/grammar.dart |
deleted file mode 100644 |
index 187ecfa3c8759837acf01841ee7579d885d9f398..0000000000000000000000000000000000000000 |
--- a/petitparser/lib/src/dart/grammar.dart |
+++ /dev/null |
@@ -1,788 +0,0 @@ |
-part of dart; |
- |
-/** |
- * Dart grammar. |
- */ |
-class DartGrammar extends GrammarParser { |
- DartGrammar() : super(new DartGrammarDefinition()); |
-} |
- |
-/** |
- * Dart grammar definition. |
- * |
- * Adapted from [https://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/language/grammar/Dart.g]. |
- */ |
-class DartGrammarDefinition extends GrammarDefinition { |
- |
- Parser token(input) { |
- if (input is String) { |
- input = input.length == 1 ? char(input) : string(input); |
- } else if (input is Function) { |
- input = ref(input); |
- } |
- if (input is! Parser && input is TrimmingParser) { |
- throw new StateError('Invalid token parser: $input'); |
- } |
- return input.token().trim(ref(HIDDEN)); |
- } |
- |
- |
- // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
- // for details. All rights reserved. Use of this source code is governed by a |
- // BSD-style license that can be found in the LICENSE file. |
- |
- // ----------------------------------------------------------------- |
- // Keyword definitions. |
- // ----------------------------------------------------------------- |
- BREAK() => ref(token, 'break'); |
- CASE() => ref(token, 'case'); |
- CATCH() => ref(token, 'catch'); |
- CONST() => ref(token, 'const'); |
- CONTINUE() => ref(token, 'continue'); |
- DEFAULT() => ref(token, 'default'); |
- DO() => ref(token, 'do'); |
- ELSE() => ref(token, 'else'); |
- FALSE() => ref(token, 'false'); |
- FINAL() => ref(token, 'final'); |
- FINALLY() => ref(token, 'finally'); |
- FOR() => ref(token, 'for'); |
- IF() => ref(token, 'if'); |
- IN() => ref(token, 'in'); |
- NEW() => ref(token, 'new'); |
- NULL() => ref(token, 'null'); |
- RETURN() => ref(token, 'return'); |
- SUPER() => ref(token, 'super'); |
- SWITCH() => ref(token, 'switch'); |
- THIS() => ref(token, 'this'); |
- THROW() => ref(token, 'throw'); |
- TRUE() => ref(token, 'true'); |
- TRY() => ref(token, 'try'); |
- VAR() => ref(token, 'var'); |
- VOID() => ref(token, 'void'); |
- WHILE() => ref(token, 'while'); |
- |
- // Pseudo-keywords that should also be valid identifiers. |
- ABSTRACT() => ref(token, 'abstract'); |
- ASSERT() => ref(token, 'assert'); |
- CLASS() => ref(token, 'class'); |
- EXTENDS() => ref(token, 'extends'); |
- FACTORY() => ref(token, 'factory'); |
- GET() => ref(token, 'get'); |
- IMPLEMENTS() => ref(token, 'implements'); |
- IMPORT() => ref(token, 'import'); |
- INTERFACE() => ref(token, 'interface'); |
- IS() => ref(token, 'is'); |
- LIBRARY() => ref(token, 'library'); |
- NATIVE() => ref(token, 'native'); |
- NEGATE() => ref(token, 'negate'); |
- OPERATOR() => ref(token, 'operator'); |
- SET() => ref(token, 'set'); |
- SOURCE() => ref(token, 'source'); |
- STATIC() => ref(token, 'static'); |
- TYPEDEF() => ref(token, 'typedef'); |
- |
- // ----------------------------------------------------------------- |
- // Grammar productions. |
- // ----------------------------------------------------------------- |
- start() => ref(compilationUnit).end(); |
- |
- compilationUnit() => |
- ref(HASHBANG).optional() |
- & ref(directive).star() |
- & ref(topLevelDefinition).star(); |
- |
- directive() => |
- ref(token, '#') |
- & ref(identifier) |
- & ref(arguments) |
- & ref(token, ';'); |
- |
- topLevelDefinition() => |
- ref(classDefinition) |
- | ref(interfaceDefinition) |
- | ref(functionTypeAlias) |
- | ref(functionDeclaration) & ref(functionBodyOrNative) |
- | ref(returnType).optional() & ref(getOrSet) & ref(identifier) & ref(formalParameterList) & ref(functionBodyOrNative) |
- | ref(FINAL) & ref(type).optional() & ref(staticFinalDeclarationList) & ref(token, ';') |
- | ref(constInitializedVariableDeclaration) & ref(token, ';'); |
- |
- classDefinition() => |
- ref(CLASS) & ref(identifier) & ref(typeParameters).optional() & ref(superclass).optional() & ref(interfaces).optional() & |
- ref(token, '{') & ref(classMemberDefinition).star() & ref(token, '}') |
- | ref(CLASS) & ref(identifier) & ref(typeParameters).optional() & ref(interfaces).optional() & ref(NATIVE) & ref(token, STRING) & |
- ref(token, '{') & ref(classMemberDefinition).star() & ref(token, '}'); |
- |
- typeParameter() => ref(identifier) & (ref(EXTENDS) & ref(type)).optional(); |
- |
- typeParameters() => ref(token, '<') & ref(typeParameter) & (ref(token, ',') & ref(typeParameter)).star() & ref(token, '>'); |
- |
- superclass() => ref(EXTENDS) & ref(type); |
- |
- interfaces() => ref(IMPLEMENTS) & ref(typeList); |
- |
- superinterfaces() => ref(EXTENDS) & ref(typeList); |
- |
- // This rule is organized in a way that may not be most readable, but |
- // gives the best error messages. |
- classMemberDefinition() => |
- ref(declaration) & ref(token, ';') |
- | ref(constructorDeclaration) & ref(token, ';') |
- | ref(methodDeclaration) & ref(functionBodyOrNative) |
- | ref(CONST) & ref(factoryConstructorDeclaration) & ref(functionNative); |
- |
- functionBodyOrNative() => |
- ref(NATIVE) & ref(functionBody) |
- | ref(functionNative) |
- | ref(functionBody); |
- |
- functionNative() => ref(NATIVE) & ref(token, STRING).optional() & ref(token, ';'); |
- |
- // A method, operator, or constructor (which all should be followed by |
- // a block of code). |
- methodDeclaration() => |
- ref(factoryConstructorDeclaration) |
- | ref(STATIC) & ref(functionDeclaration) |
- | ref(specialSignatureDefinition) |
- | ref(functionDeclaration) & ref(initializers).optional() |
- | ref(namedConstructorDeclaration) & ref(initializers).optional(); |
- |
-// An abstract method/operator, a field, or const constructor (which |
-// all should be followed by a semicolon). |
- declaration() => |
- ref(constantConstructorDeclaration) & (ref(redirection) | ref(initializers)).optional() |
- | ref(functionDeclaration) & ref(redirection) |
- | ref(namedConstructorDeclaration) & ref(redirection) |
- | ref(ABSTRACT) & ref(specialSignatureDefinition) |
- | ref(ABSTRACT) & ref(functionDeclaration) |
- | ref(STATIC) & ref(FINAL) & ref(type).optional() & ref(staticFinalDeclarationList) |
- | ref(STATIC).optional() & ref(constInitializedVariableDeclaration); |
- |
- initializers() => ref(token, ':') & ref(superCallOrFieldInitializer) & (ref(token, ',') & ref(superCallOrFieldInitializer)).star(); |
- |
- redirection() => ref(token, ':') & ref(THIS) & (ref(token, '.') & ref(identifier)).optional() & ref(arguments); |
- |
- fieldInitializer() => (ref(THIS) & ref(token, '.')).optional() & ref(identifier) & ref(token, '=') & ref(conditionalExpression); |
- |
- superCallOrFieldInitializer() => |
- ref(SUPER) & ref(arguments) |
- | ref(SUPER) & ref(token, '.') & ref(identifier) & ref(arguments) |
- | ref(fieldInitializer); |
- |
- staticFinalDeclarationList() => ref(staticFinalDeclaration) & (ref(token, ',') & ref(staticFinalDeclaration)).star(); |
- |
- staticFinalDeclaration() => ref(identifier) & ref(token, '=') & ref(constantExpression); |
- |
- interfaceDefinition() => ref(INTERFACE) & ref(identifier) & ref(typeParameters).optional() & |
- ref(superinterfaces).optional() & ref(factorySpecification).optional() & ref(token, '{') & |
- ref(interfaceMemberDefinition).star() & ref(token, '}'); |
- |
- factorySpecification() => ref(FACTORY) & ref(type); |
- |
- functionTypeAlias() => ref(TYPEDEF) & ref(functionPrefix) & ref(typeParameters).optional() & |
- ref(formalParameterList) & ref(token, ';'); |
- |
- interfaceMemberDefinition() => |
- ref(STATIC) & ref(FINAL) & ref(type).optional() & ref(initializedIdentifierList) & ref(token, ';') |
- | ref(functionDeclaration) & ref(token, ';') |
- | ref(constantConstructorDeclaration) & ref(token, ';') |
- | ref(namedConstructorDeclaration) & ref(token, ';') |
- | ref(specialSignatureDefinition) & ref(token, ';') |
- | ref(variableDeclaration) & ref(token, ';'); |
- |
- factoryConstructorDeclaration() => ref(FACTORY) & ref(qualified) & ref(typeParameters).optional() & |
- (ref(token, '.') & ref(identifier)).optional() & ref(formalParameterList); |
- |
- namedConstructorDeclaration() => ref(identifier) & ref(token, '.') & ref(identifier) & |
- ref(formalParameterList); |
- |
- constructorDeclaration() => |
- ref(identifier) & ref(formalParameterList) & (ref(redirection) | ref(initializers)).optional() |
- | ref(namedConstructorDeclaration) & (ref(redirection) | ref(initializers)).optional(); |
- |
- constantConstructorDeclaration() => ref(CONST) & ref(qualified) & ref(formalParameterList); |
- |
- specialSignatureDefinition() => |
- ref(STATIC).optional() & ref(returnType).optional() & ref(getOrSet) & ref(identifier) & ref(formalParameterList) |
- | ref(returnType).optional() & ref(OPERATOR) & ref(userDefinableOperator) & ref(formalParameterList); |
- |
- getOrSet() => ref(GET) | ref(SET); |
- |
- userDefinableOperator() => |
- ref(multiplicativeOperator) |
- | ref(additiveOperator) |
- | ref(shiftOperator) |
- | ref(relationalOperator) |
- | ref(bitwiseOperator) |
- | ref(token, '==') // Disallow negative and === equality checks. |
- | ref(token, '~') // Disallow ! operator. |
- | ref(NEGATE) |
- | ref(token, '[') & ref(token, ']') |
- | ref(token, '[') & ref(token, ']') & ref(token, '='); |
- |
- prefixOperator() => |
- ref(additiveOperator) |
- | ref(negateOperator); |
- |
- postfixOperator() => |
- ref(incrementOperator); |
- |
- negateOperator() => |
- ref(token, '!') |
- | ref(token, '~'); |
- |
- multiplicativeOperator() => |
- ref(token, '*') |
- | ref(token, '/') |
- | ref(token, '%') |
- | ref(token, '~/'); |
- |
- assignmentOperator() => |
- ref(token, '=') |
- | ref(token, '*=') |
- | ref(token, '/=') |
- | ref(token, '~/=') |
- | ref(token, '%=') |
- | ref(token, '+=') |
- | ref(token, '-=') |
- | ref(token, '<<=') |
- | ref(token, '>') & ref(token, '>') & ref(token, '>') & ref(token, '=') |
- | ref(token, '>') & ref(token, '>') & ref(token, '=') |
- | ref(token, '&=') |
- | ref(token, '^=') |
- | ref(token, '|='); |
- |
- additiveOperator() => |
- ref(token, '+') |
- | ref(token, '-'); |
- |
- incrementOperator() => |
- ref(token, '++') |
- | ref(token, '--'); |
- |
- shiftOperator() => |
- ref(token, '<<') |
- | ref(token, '>') & ref(token, '>') & ref(token, '>') |
- | ref(token, '>') & ref(token, '>'); |
- |
- relationalOperator() => |
- ref(token, '>') & ref(token, '=') |
- | ref(token, '>') |
- | ref(token, '<=') |
- | ref(token, '<'); |
- |
- equalityOperator() => |
- ref(token, '==') |
- | ref(token, '!=') |
- | ref(token, '===') |
- | ref(token, '!=='); |
- |
- bitwiseOperator() => |
- ref(token, '&') |
- | ref(token, '^') |
- | ref(token, '|'); |
- |
- formalParameterList() => |
- ref(token, '(') & ref(namedFormalParameters).optional() & ref(token, ')') |
- | ref(token, '(') & ref(normalFormalParameter) & ref(normalFormalParameterTail).optional() & ref(token, ')'); |
- |
- normalFormalParameterTail() => |
- ref(token, ',') & ref(namedFormalParameters) |
- | ref(token, ',') & ref(normalFormalParameter) & ref(normalFormalParameterTail).optional(); |
- |
- normalFormalParameter() => |
- ref(functionDeclaration) |
- | ref(fieldFormalParameter) |
- | ref(simpleFormalParameter); |
- |
- simpleFormalParameter() => |
- ref(declaredIdentifier) |
- | ref(identifier); |
- |
- fieldFormalParameter() => |
- ref(finalVarOrType).optional() & ref(THIS) & ref(token, '.') & ref(identifier); |
- |
- namedFormalParameters() => |
- ref(token, '[') & ref(defaultFormalParameter) & (ref(token, ',') & ref(defaultFormalParameter)).star() & ref(token, ']'); |
- |
- defaultFormalParameter() => |
- ref(normalFormalParameter) & (ref(token, '=') & ref(constantExpression)).optional(); |
- |
- returnType() => |
- ref(VOID) |
- | ref(type); |
- |
- finalVarOrType() => |
- ref(FINAL) & ref(type).optional() |
- | ref(VAR) |
- | ref(type) |
- ; |
- |
- // We have to introduce a separate rule for 'declared' identifiers to |
- // allow ANTLR to decide if the first identifier we encounter after |
- // final is a type or an identifier. Before this change, we used the |
- // production 'finalVarOrType identifier' in numerous places. |
- declaredIdentifier() => |
- ref(FINAL) & ref(type).optional() & ref(identifier) |
- | ref(VAR) & ref(identifier) |
- | ref(type) & ref(identifier) |
- ; |
- |
- identifier() => ref(token, ref(IDENTIFIER) |
- | ref(ABSTRACT) |
- | ref(ASSERT) |
- | ref(CLASS) |
- | ref(EXTENDS) |
- | ref(FACTORY) |
- | ref(GET) |
- | ref(IMPLEMENTS) |
- | ref(IMPORT) |
- | ref(INTERFACE) |
- | ref(IS) |
- | ref(LIBRARY) |
- | ref(NATIVE) |
- | ref(NEGATE) |
- | ref(OPERATOR) |
- | ref(SET) |
- | ref(SOURCE) |
- | ref(STATIC) |
- | ref(TYPEDEF) |
- ); |
- |
- qualified() => |
- ref(identifier) & (ref(token, '.') & ref(identifier)).optional() |
- ; |
- |
- type() => |
- ref(qualified) & ref(typeArguments).optional() |
- ; |
- |
- typeArguments() => |
- ref(token, '<') & ref(typeList) & ref(token, '>') |
- ; |
- |
- typeList() => |
- ref(type) & (ref(token, ',') & ref(type)).star() |
- ; |
- |
- block() => |
- ref(token, '{') & ref(statements) & ref(token, '}') |
- ; |
- |
- statements() => |
- ref(statement).star() |
- ; |
- |
- statement() => |
- ref(label).star() & ref(nonLabelledStatement) |
- ; |
- |
- nonLabelledStatement() => |
- ref(block) |
- | ref(initializedVariableDeclaration) & ref(token, ';') |
- | ref(iterationStatement) |
- | ref(selectionStatement) |
- | ref(tryStatement) |
- | ref(BREAK) & ref(identifier).optional() & ref(token, ';') |
- | ref(CONTINUE) & ref(identifier).optional() & ref(token, ';') |
- | ref(RETURN) & ref(expression).optional() & ref(token, ';') |
- | ref(THROW) & ref(expression).optional() & ref(token, ';') |
- | ref(expression).optional() & ref(token, ';') |
- | ref(ASSERT) & ref(token, '(') & ref(conditionalExpression) & ref(token, ')') & ref(token, ';') |
- | ref(functionDeclaration) & ref(functionBody) |
- ; |
- |
- label() => |
- ref(identifier) & ref(token, ':') |
- ; |
- |
- iterationStatement() => |
- ref(WHILE) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(statement) |
- | ref(DO) & ref(statement) & ref(WHILE) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(token, ';') |
- | ref(FOR) & ref(token, '(') & ref(forLoopParts) & ref(token, ')') & ref(statement) |
- ; |
- |
- forLoopParts() => |
- ref(forInitializerStatement) & ref(expression).optional() & ref(token, ';') & ref(expressionList).optional() |
- | ref(declaredIdentifier) & ref(IN) & ref(expression) |
- | ref(identifier) & ref(IN) & ref(expression) |
- ; |
- |
- forInitializerStatement() => |
- ref(initializedVariableDeclaration) & ref(token, ';') |
- | ref(expression).optional() & ref(token, ';') |
- ; |
- |
- selectionStatement() => |
- ref(IF) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(statement) & (ref(ELSE) & ref(statement)).optional() |
- | ref(SWITCH) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(token, '{') & ref(switchCase).star() & ref(defaultCase).optional() & ref(token, '}') |
- ; |
- |
- switchCase() => |
- ref(label).optional() & (ref(CASE) & ref(expression) & ref(token, ':')).plus() & ref(statements) |
- ; |
- |
- defaultCase() => |
- ref(label).optional() & (ref(CASE) & ref(expression) & ref(token, ':')).star() & ref(DEFAULT) & ref(token, ':') & ref(statements) |
- ; |
- |
- tryStatement() => |
- ref(TRY) & ref(block) & (ref(catchPart).plus() & ref(finallyPart).optional() | ref(finallyPart)) |
- ; |
- |
- catchPart() => |
- ref(CATCH) & ref(token, '(') & ref(declaredIdentifier) & (ref(token, ',') & ref(declaredIdentifier)).optional() & ref(token, ')') & ref(block) |
- ; |
- |
- finallyPart() => |
- ref(FINALLY) & ref(block) |
- ; |
- |
- variableDeclaration() => |
- ref(declaredIdentifier) & (ref(token, ',') & ref(identifier)).star() |
- ; |
- |
- initializedVariableDeclaration() => |
- ref(declaredIdentifier) & (ref(token, '=') & ref(expression)).optional() & (ref(token, ',') & ref(initializedIdentifier)).star() |
- ; |
- |
- initializedIdentifierList() => |
- ref(initializedIdentifier) & (ref(token, ',') & ref(initializedIdentifier)).star() |
- ; |
- |
- initializedIdentifier() => |
- ref(identifier) & (ref(token, '=') & ref(expression)).optional() |
- ; |
- |
- constInitializedVariableDeclaration() => |
- ref(declaredIdentifier) & (ref(token, '=') & ref(constantExpression)).optional() & |
- (ref(token, ',') & ref(constInitializedIdentifier)).star() |
- ; |
- |
- constInitializedIdentifier() => |
- ref(identifier) & (ref(token, '=') & ref(constantExpression)).optional() |
- ; |
- |
- // The constant expression production is used to mark certain expressions |
- // as only being allowed to hold a compile-time constant. The grammar cannot |
- // express these restrictions (yet), so this will have to be enforced by a |
- // separate analysis phase. |
- constantExpression() => |
- ref(expression) |
- ; |
- |
- expression() => |
- ref(assignableExpression) & ref(assignmentOperator) & ref(expression) |
- | ref(conditionalExpression) |
- ; |
- |
- expressionList() => |
- ref(expression) & (ref(token, ',') & ref(expression)).star() |
- ; |
- |
- arguments() => |
- ref(token, '(') & ref(argumentList).optional() & ref(token, ')') |
- ; |
- |
- argumentList() => |
- ref(namedArgument) & (ref(token, ',') & ref(namedArgument)).star() |
- | ref(expressionList) & (ref(token, ',') & ref(namedArgument)).star() |
- ; |
- |
- namedArgument() => |
- ref(label) & ref(expression) |
- ; |
- |
- assignableExpression() => |
- ref(primary) & (ref(arguments).star() & ref(assignableSelector)).plus() |
- | ref(SUPER) & ref(assignableSelector) |
- | ref(identifier) |
- ; |
- |
- conditionalExpression() => |
- ref(logicalOrExpression) & (ref(token, '?') & ref(expression) & ref(token, ':') & ref(expression)).optional() |
- ; |
- |
- logicalOrExpression() => |
- ref(logicalAndExpression) & (ref(token, '||') & ref(logicalAndExpression)).star() |
- ; |
- |
- logicalAndExpression() => |
- ref(bitwiseOrExpression) & (ref(token, '&&') & ref(bitwiseOrExpression)).star() |
- ; |
- |
- bitwiseOrExpression() => |
- ref(bitwiseXorExpression) & (ref(token, '|') & ref(bitwiseXorExpression)).star() |
- | ref(SUPER) & (ref(token, '|') & ref(bitwiseXorExpression)).plus() |
- ; |
- |
- bitwiseXorExpression() => |
- ref(bitwiseAndExpression) & (ref(token, '^') & ref(bitwiseAndExpression)).star() |
- | ref(SUPER) & (ref(token, '^') & ref(bitwiseAndExpression)).plus() |
- ; |
- |
- bitwiseAndExpression() => |
- ref(equalityExpression) & (ref(token, '&') & ref(equalityExpression)).star() |
- | ref(SUPER) & (ref(token, '&') & ref(equalityExpression)).plus() |
- ; |
- |
- equalityExpression() => |
- ref(relationalExpression) & (ref(equalityOperator) & ref(relationalExpression)).optional() |
- | ref(SUPER) & ref(equalityOperator) & ref(relationalExpression) |
- ; |
- |
- relationalExpression() => |
- ref(shiftExpression) & (ref(isOperator) & ref(type) | ref(relationalOperator) & ref(shiftExpression)).optional() |
- | ref(SUPER) & ref(relationalOperator) & ref(shiftExpression) |
- ; |
- |
- isOperator() => |
- ref(IS) & ref(token, '!').optional() |
- ; |
- |
- shiftExpression() => |
- ref(additiveExpression) & (ref(shiftOperator) & ref(additiveExpression)).star() |
- | ref(SUPER) & (ref(shiftOperator) & ref(additiveExpression)).plus() |
- ; |
- |
- additiveExpression() => |
- ref(multiplicativeExpression) & (ref(additiveOperator) & ref(multiplicativeExpression)).star() |
- | ref(SUPER) & (ref(additiveOperator) & ref(multiplicativeExpression)).plus() |
- ; |
- |
- multiplicativeExpression() => |
- ref(unaryExpression) & (ref(multiplicativeOperator) & ref(unaryExpression)).star() |
- | ref(SUPER) & (ref(multiplicativeOperator) & ref(unaryExpression)).plus() |
- ; |
- |
- unaryExpression() => |
- ref(postfixExpression) |
- | ref(prefixOperator) & ref(unaryExpression) |
- | ref(negateOperator) & ref(SUPER) |
- | ref(token, '-') & ref(SUPER) |
- | ref(incrementOperator) & ref(assignableExpression) |
- ; |
- |
- postfixExpression() => |
- ref(assignableExpression) & ref(postfixOperator) |
- | ref(primary) & ref(selector).star() |
- ; |
- |
- selector() => |
- ref(assignableSelector) |
- | ref(arguments) |
- ; |
- |
- assignableSelector() => |
- ref(token, '[') & ref(expression) & ref(token, ']') |
- | ref(token, '.') & ref(identifier) |
- ; |
- |
- primary() => |
- ref(primaryNoFE) |
- | ref(primaryFE) |
- ; |
- |
- primaryFE() => |
- ref(functionExpression) |
- | ref(primaryNoFE) |
- ; |
- |
- primaryNoFE() => |
- ref(THIS) |
- | ref(SUPER) & ref(assignableSelector) |
- | ref(literal) |
- | ref(identifier) |
- | ref(CONST).optional() & ref(typeArguments).optional() & ref(compoundLiteral) |
- | (ref(NEW) | ref(CONST)) & ref(type) & (ref(token, '.') & ref(identifier)).optional() & ref(arguments) |
- | ref(expressionInParentheses) |
- ; |
- |
- expressionInParentheses() => |
- ref(token, '(') & ref(expression) & ref(token, ')') |
- ; |
- |
- literal() => ref(token, |
- ref(NULL) |
- | ref(TRUE) |
- | ref(FALSE) |
- | ref(HEX_NUMBER) |
- | ref(NUMBER) |
- | ref(STRING)) |
- ; |
- |
- compoundLiteral() => |
- ref(listLiteral) |
- | ref(mapLiteral) |
- ; |
- |
- listLiteral() => |
- ref(token, '[') & (ref(expressionList) & ref(token, ',').optional()).optional() & ref(token, ']') |
- ; |
- |
- mapLiteral() => |
- ref(token, '{') & (ref(mapLiteralEntry) & (ref(token, ',') & ref(mapLiteralEntry)).star() & ref(token, ',').optional()).optional() & ref(token, '}') |
- ; |
- |
- mapLiteralEntry() => |
- ref(token, STRING) & ref(token, ':') & ref(expression) |
- ; |
- |
- functionExpression() => |
- (ref(returnType).optional() & ref(identifier)).optional() & ref(formalParameterList) & ref(functionExpressionBody) |
- ; |
- |
- functionDeclaration() => |
- ref(returnType).optional() & ref(identifier) & ref(formalParameterList) |
- ; |
- |
- functionPrefix() => |
- ref(returnType).optional() & ref(identifier) |
- ; |
- |
- functionBody() => |
- ref(token, '=>') & ref(expression) & ref(token, ';') |
- | ref(block) |
- ; |
- |
- functionExpressionBody() => |
- ref(token, '=>') & ref(expression) |
- | ref(block) |
- ; |
- |
- // ----------------------------------------------------------------- |
- // Library files. |
- // ----------------------------------------------------------------- |
- libraryUnit() => |
- ref(libraryDefinition).end() |
- ; |
- |
- libraryDefinition() => |
- ref(LIBRARY) & ref(token, '{') & ref(libraryBody) & ref(token, '}') |
- ; |
- |
- libraryBody() => |
- ref(libraryImport).optional() & ref(librarySource).optional() |
- ; |
- |
- libraryImport() => |
- ref(IMPORT) & ref(token, '=') & ref(token, '[') & ref(importReferences).optional() & ref(token, ']') |
- ; |
- |
- importReferences() => |
- ref(importReference) & (ref(token, ',') & ref(importReference)).star() & ref(token, ',').optional() |
- ; |
- |
- importReference() => |
- (ref(token, IDENTIFIER) & ref(token, ':')).optional() & ref(token, STRING) |
- ; |
- |
- librarySource() => |
- ref(SOURCE) & ref(token, '=') & ref(token, '[') & ref(sourceUrls).optional() & ref(token, ']') |
- ; |
- |
- sourceUrls() => |
- ref(token, STRING) & (ref(token, ',') & ref(token, STRING)).star() & ref(token, ',').optional() |
- ; |
- |
- |
- // ----------------------------------------------------------------- |
- // Lexical tokens. |
- // ----------------------------------------------------------------- |
- IDENTIFIER_NO_DOLLAR() => |
- ref(IDENTIFIER_START_NO_DOLLAR) & ref(IDENTIFIER_PART_NO_DOLLAR).star() |
- ; |
- |
- IDENTIFIER() => |
- ref(IDENTIFIER_START) & ref(IDENTIFIER_PART).star() |
- ; |
- |
- HEX_NUMBER() => |
- string('0x') & ref(HEX_DIGIT).plus() |
- | string('0X') & ref(HEX_DIGIT).plus() |
- ; |
- |
- NUMBER() => |
- ref(DIGIT).plus() & ref(NUMBER_OPT_FRACTIONAL_PART) & ref(EXPONENT).optional() & ref(NUMBER_OPT_ILLEGAL_END) |
- | char('.') & ref(DIGIT).plus() & ref(EXPONENT).optional() & ref(NUMBER_OPT_ILLEGAL_END) |
- ; |
- |
- NUMBER_OPT_FRACTIONAL_PART() => |
- char('.') & ref(DIGIT).plus() |
- | epsilon() |
- ; |
- |
- NUMBER_OPT_ILLEGAL_END() => epsilon(); |
-// ref(IDENTIFIER_START).end() |
-// | epsilon() |
-// ; |
- |
- HEX_DIGIT() => pattern('0-9a-fA-F'); |
- |
- IDENTIFIER_START() => ref(IDENTIFIER_START_NO_DOLLAR) | char('\$'); |
- |
- IDENTIFIER_START_NO_DOLLAR() => ref(LETTER) | char('_'); |
- |
- IDENTIFIER_PART_NO_DOLLAR() => ref(IDENTIFIER_START_NO_DOLLAR) | ref(DIGIT); |
- |
- IDENTIFIER_PART() => ref(IDENTIFIER_START) | ref(DIGIT); |
- |
- LETTER() => letter(); |
- |
- DIGIT() => digit(); |
- |
- EXPONENT() => pattern('eE') & pattern('+-').optional() & ref(DIGIT).plus(); |
- |
- STRING() => |
- char('@').optional() & ref(MULTI_LINE_STRING) |
- | ref(SINGLE_LINE_STRING) |
- ; |
- |
- MULTI_LINE_STRING() => |
- string('"""') & any().starLazy(string('"""')) & string('"""') |
- | string("'''") & any().starLazy(string("'''")) & string("'''") |
- ; |
- |
- SINGLE_LINE_STRING() => |
- char('"') & ref(STRING_CONTENT_DQ).star() & char('"') |
- | char("'") & ref(STRING_CONTENT_SQ).star() & char("'") |
- | string('@"') & pattern('^"\n\r').star() & char('"') |
- | string("@'") & pattern("^'\n\r").star() & char("'") |
- ; |
- |
- STRING_CONTENT_DQ() => |
- pattern('^\\"\n\r') |
- | char('\\') & pattern('\n\r') |
- ; |
- |
- STRING_CONTENT_SQ() => |
- pattern("^\\'\n\r") |
- | char('\\') & pattern('\n\r') |
- ; |
- |
- NEWLINE() => pattern('\n\r'); |
- |
- HASHBANG() => string('#!') & pattern('^\n\r').star() & ref(NEWLINE).optional(); |
- |
- |
- // ----------------------------------------------------------------- |
- // Whitespace and comments. |
- // ----------------------------------------------------------------- |
- HIDDEN() => ref(HIDDEN_STUFF).plus(); |
- |
- HIDDEN_STUFF() => ref(WHITESPACE) |
- | ref(SINGLE_LINE_COMMENT) |
- | ref(MULTI_LINE_COMMENT) |
- ; |
- |
- WHITESPACE() => whitespace(); |
- |
- SINGLE_LINE_COMMENT() => string('//') |
- & ref(NEWLINE).neg().star() |
- & ref(NEWLINE).optional() |
- ; |
- |
- MULTI_LINE_COMMENT() => string('/*') |
- & (ref(MULTI_LINE_COMMENT) | string('*/').neg()).star() & string('*/') |
- ; |
- |
-} |