Skip to content

Commit

Permalink
Refactored NumberUnit and FunctionDefinition. Added OctalNumber. Fixe…
Browse files Browse the repository at this point in the history
…d number followed by identifier with no whitespace.
  • Loading branch information
matheusaaguiar committed Mar 24, 2023
1 parent 2ca349c commit 9343b81
Show file tree
Hide file tree
Showing 11 changed files with 76 additions and 7 deletions.
5 changes: 4 additions & 1 deletion Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ Compiler Features:


Bugfixes:

* Antlr Grammar: Fix of a discrepancy which allowed numbers followed by an identifier with no whitespace.
* Antlr Grammar: More strict for free functions and will no longer accept some specifiers which are exclusive of contract functions.
* Antlr Grammar: Fix divergent behaviour which allowed octal numbers.


### 0.8.19 (2023-02-22)

Expand Down
16 changes: 15 additions & 1 deletion docs/grammar/SolidityLexer.g4
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ New: 'new';
/**
* Unit denomination for numbers.
*/
NumberUnit: 'wei' | 'gwei' | 'ether' | 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'years';
SubDenomination: 'wei' | 'gwei' | 'ether' | 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'years';
Override: 'override';
Payable: 'payable';
Pragma: 'pragma' -> pushMode(PragmaMode);
Expand Down Expand Up @@ -220,6 +220,14 @@ fragment EvenHexDigits: HexCharacter HexCharacter ('_'? HexCharacter HexCharacte
//@doc:inline
fragment HexCharacter: [0-9A-Fa-f];
/**
* Scanned but not used by any rule, i.e, disallowed.
* solc parser considers number starting with '0', not immediately followed by '.' or 'x' as
* octal, even if non octal digits '8' and '9' are present.
*/
OctalNumber: '0' DecimalDigits ('.' DecimalDigits)?;
/**
* A decimal number literal consists of decimal digits that may be delimited by underscores and
* an optional positive or negative exponent.
Expand All @@ -230,6 +238,12 @@ DecimalNumber: (DecimalDigits | (DecimalDigits? '.' DecimalDigits)) ([eE] '-'? D
fragment DecimalDigits: [0-9] ('_'? [0-9])* ;
/**
* This is needed to avoid successfully parsing a number followed by a string with no whitespace between.
*/
DecimalNumberFollowedByIdentifier: DecimalNumber Identifier;
/**
* An identifier in solidity has to start with a letter, a dollar-sign or an underscore and
* may additionally contain numbers after the first symbol.
Expand Down
26 changes: 21 additions & 5 deletions docs/grammar/SolidityParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ sourceUnit: (
| contractDefinition
| interfaceDefinition
| libraryDefinition
| functionDefinition
| freeFunctionDefinition
| constantVariableDeclaration
| structDefinition
| enumDefinition
Expand Down Expand Up @@ -85,7 +85,7 @@ inheritanceSpecifier: name=identifierPath arguments=callArgumentList?;
*/
contractBodyElement:
constructorDefinition
| functionDefinition
| contractFunctionDefinition
| modifierDefinition
| fallbackFunctionDefinition
| receiveFunctionDefinition
Expand Down Expand Up @@ -156,12 +156,12 @@ 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
contractFunctionDefinition
locals[
boolean visibilitySet = false,
boolean mutabilitySet = false,
boolean virtualSet = false,
boolean overrideSpecifierSet = false
boolean overrideSpecifierSet = false,
]
:
Function (identifier | Fallback | Receive)
Expand All @@ -175,6 +175,17 @@ locals[
)*
(Returns LParen returnParameters=parameterList RParen)?
(Semicolon | body=block);

/**
* The definition of a free function.
*/
freeFunctionDefinition:
Function (identifier | Fallback | Receive)
LParen (arguments=parameterList)? RParen
stateMutability?
(Returns LParen returnParameters=parameterList RParen)?
(Semicolon | body=block);

/**
* The definition of a modifier.
* Note that within the body block of a modifier, the underscore cannot be used as identifier,
Expand Down Expand Up @@ -394,6 +405,7 @@ expression:
| (
identifier
| literal
| literalWithSubDenomination
| elementaryTypeName[false]
) # PrimaryExpression
;
Expand All @@ -412,6 +424,9 @@ inlineArrayExpression: LBrack (expression ( Comma expression)* ) RBrack;
identifier: Identifier | From | Error | Revert | Global;

literal: stringLiteral | numberLiteral | booleanLiteral | hexStringLiteral | unicodeStringLiteral;

literalWithSubDenomination: numberLiteral SubDenomination;

booleanLiteral: True | False;
/**
* A full string literal consists of either one or several consecutive quoted strings.
Expand All @@ -429,7 +444,8 @@ unicodeStringLiteral: UnicodeStringLiteral+;
/**
* Number literals can be decimal or hexadecimal numbers with an optional unit.
*/
numberLiteral: (DecimalNumber | HexNumber) NumberUnit?;
numberLiteral: DecimalNumber | HexNumber;

/**
* A curly-braced block of statements. Opens its own scope.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract C {
uint constant y = 1wei;
}
// ----
// ParserError 8936: (32-33): Identifier-start is not allowed at end of a number.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract C {
uint constant y = 8 gwei ether;
}
// ----
// ParserError 2314: (39-44): Expected ';' but got 'ether'
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
function fallback() {}
// ----
// Warning 3445: (9-17): This function is named "fallback" but is not the fallback function of the contract. If you intend this to be a fallback function, use "fallback(...) { ... }" without the "function" keyword to define it.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
function receive() {}
// ----
// Warning 3445: (9-16): This function is named "receive" but is not the receive function of the contract. If you intend this to be a receive function, use "receive(...) { ... }" without the "function" keyword to define it.
5 changes: 5 additions & 0 deletions test/libsolidity/syntaxTests/literals/invalid_hex_number.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract C {
uint x = 0x1000abcdefgh;
}
// ----
// ParserError 8936: (26-38): Identifier-start is not allowed at end of a number.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract C {
uint y = 01gwei;
}
// ----
// ParserError 8936: (26-27): Octal numbers not allowed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract C {
uint y = 098;
}
// ----
// ParserError 8936: (26-27): Octal numbers not allowed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
contract C {
uint x = 0100;
}
// ----
// ParserError 8936: (26-27): Octal numbers not allowed.

0 comments on commit 9343b81

Please sign in to comment.