User-defined literal suffixes: Grammar

This commit is contained in:
Matheus Aguiar 2023-03-15 18:54:45 -03:00 committed by Kamil Śliwak
parent 81118c729e
commit 5d59bbeca6
3 changed files with 13 additions and 6 deletions

View File

@ -85,6 +85,7 @@ SignedIntegerType:
Storage: 'storage';
String: 'string';
Struct: 'struct';
Suffix: 'suffix';
True: 'true';
Try: 'try';
Type: 'type';

View File

@ -16,7 +16,7 @@ sourceUnit: (
| contractDefinition
| interfaceDefinition
| libraryDefinition
| functionDefinition
| functionDefinition[true]
| constantVariableDeclaration
| structDefinition
| enumDefinition
@ -85,7 +85,7 @@ inheritanceSpecifier: name=identifierPath arguments=callArgumentList?;
*/
contractBodyElement:
constructorDefinition
| functionDefinition
| functionDefinition[false]
| modifierDefinition
| fallbackFunctionDefinition
| receiveFunctionDefinition
@ -156,10 +156,11 @@ overrideSpecifier: Override (LParen overrides+=identifierPath (Comma overrides+=
* Depending on the context in which the function is defined, further restrictions may apply,
* e.g. functions in interfaces have to be unimplemented, i.e. may not contain a body block.
*/
functionDefinition
functionDefinition[boolean free]
locals[
boolean visibilitySet = false,
boolean mutabilitySet = false,
boolean suffixSet = false,
boolean virtualSet = false,
boolean overrideSpecifierSet = false,
]
@ -169,7 +170,8 @@ locals[
(
{!$visibilitySet}? visibility {$visibilitySet = true;}
| {!$mutabilitySet}? stateMutability {$mutabilitySet = true;}
| modifierInvocation
| {!$free}? modifierInvocation
| {$free}? {!$suffixSet}? Suffix {$suffixSet = true;}
| {!$virtualSet}? Virtual {$virtualSet = true;}
| {!$overrideSpecifierSet}? overrideSpecifier {$overrideSpecifierSet = true;}
)*
@ -396,6 +398,7 @@ expression:
identifier
| literal
| literalWithSubDenomination
| suffixedLiteral
| elementaryTypeName[false]
) # PrimaryExpression
;
@ -411,12 +414,14 @@ inlineArrayExpression: LBrack (expression ( Comma expression)* ) RBrack;
/**
* Besides regular non-keyword Identifiers, some keywords like 'from' and 'error' can also be used as identifiers.
*/
identifier: Identifier | From | Error | Revert | Global;
identifier: Identifier | From | Error | Revert | Global | Suffix;
literal: stringLiteral | numberLiteral | booleanLiteral | hexStringLiteral | unicodeStringLiteral;
literalWithSubDenomination: numberLiteral SubDenomination;
suffixedLiteral: literal identifier (Period identifier)*;
booleanLiteral: True | False;
/**
* A full string literal consists of either one or several consecutive quoted strings.

View File

@ -129,7 +129,8 @@ done < <(
grep -v -E 'license/license_hidden_unicode.sol' |
grep -v -E 'license/license_unicode.sol' |
# Skipping tests with 'something.address' as 'address' as the grammar fails on those
grep -v -E 'inlineAssembly/external_function_pointer_address.*.sol'
grep -v -E 'inlineAssembly/external_function_pointer_address.*.sol' |
grep -v -E 'literalSuffixes/application/invalid_address_member_on_suffix.sol'
)
YUL_FILES=()