mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Expose hex literal to the Yul parser
This allows nicer error messages.
This commit is contained in:
parent
26a76c18d4
commit
7ef9591e64
@ -668,7 +668,7 @@ void Scanner::scanToken()
|
|||||||
tie(token, m, n) = scanIdentifierOrKeyword();
|
tie(token, m, n) = scanIdentifierOrKeyword();
|
||||||
|
|
||||||
// Special case for hexadecimal literals
|
// Special case for hexadecimal literals
|
||||||
if (token == Token::Hex && m_kind != ScannerKind::Yul)
|
if (token == Token::Hex)
|
||||||
{
|
{
|
||||||
// reset
|
// reset
|
||||||
m = 0;
|
m = 0;
|
||||||
|
@ -324,7 +324,7 @@ namespace TokenTraits
|
|||||||
{
|
{
|
||||||
return tok == Token::Function || tok == Token::Let || tok == Token::If || tok == Token::Switch || tok == Token::Case ||
|
return tok == Token::Function || tok == Token::Let || tok == Token::If || tok == Token::Switch || tok == Token::Case ||
|
||||||
tok == Token::Default || tok == Token::For || tok == Token::Break || tok == Token::Continue || tok == Token::Leave ||
|
tok == Token::Default || tok == Token::For || tok == Token::Break || tok == Token::Continue || tok == Token::Leave ||
|
||||||
tok == Token::TrueLiteral || tok == Token::FalseLiteral;
|
tok == Token::TrueLiteral || tok == Token::FalseLiteral || tok == Token::HexStringLiteral || tok == Token::Hex;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Token AssignmentToBinaryOp(Token op)
|
inline Token AssignmentToBinaryOp(Token op)
|
||||||
|
@ -337,6 +337,9 @@ Parser::ElementaryOperation Parser::parseElementaryOperation()
|
|||||||
ret = std::move(literal);
|
ret = std::move(literal);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case Token::HexStringLiteral:
|
||||||
|
fatalParserError(3772_error, "Hex literals are not valid in this context.");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fatalParserError(1856_error, "Literal or identifier expected.");
|
fatalParserError(1856_error, "Literal or identifier expected.");
|
||||||
}
|
}
|
||||||
|
@ -652,9 +652,8 @@ BOOST_AUTO_TEST_CASE(hex_prefix_only)
|
|||||||
BOOST_CHECK_EQUAL(scanner.currentError(), ScannerError::IllegalToken);
|
BOOST_CHECK_EQUAL(scanner.currentError(), ScannerError::IllegalToken);
|
||||||
scanner.reset(CharStream("{ hex", ""));
|
scanner.reset(CharStream("{ hex", ""));
|
||||||
scanner.setScannerMode(ScannerKind::Yul);
|
scanner.setScannerMode(ScannerKind::Yul);
|
||||||
BOOST_CHECK_EQUAL(scanner.currentToken(), Token::LBrace);
|
BOOST_CHECK_EQUAL(scanner.next(), Token::Illegal);
|
||||||
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
|
BOOST_CHECK_EQUAL(scanner.currentError(), ScannerError::IllegalToken);
|
||||||
BOOST_CHECK_EQUAL(scanner.currentLiteral(), "hex");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(hex_invalid_space)
|
BOOST_AUTO_TEST_CASE(hex_invalid_space)
|
||||||
@ -674,10 +673,8 @@ BOOST_AUTO_TEST_CASE(hex_invalid_token)
|
|||||||
scanner.reset(CharStream("{ hex test", ""));
|
scanner.reset(CharStream("{ hex test", ""));
|
||||||
scanner.setScannerMode(ScannerKind::Yul);
|
scanner.setScannerMode(ScannerKind::Yul);
|
||||||
BOOST_CHECK_EQUAL(scanner.currentToken(), Token::LBrace);
|
BOOST_CHECK_EQUAL(scanner.currentToken(), Token::LBrace);
|
||||||
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
|
BOOST_CHECK_EQUAL(scanner.next(), Token::Illegal);
|
||||||
BOOST_CHECK_EQUAL(scanner.currentLiteral(), "hex");
|
BOOST_CHECK_EQUAL(scanner.currentError(), ScannerError::IllegalToken);
|
||||||
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
|
|
||||||
BOOST_CHECK_EQUAL(scanner.currentLiteral(), "test");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(valid_hex_literal)
|
BOOST_AUTO_TEST_CASE(valid_hex_literal)
|
||||||
|
@ -6,4 +6,4 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// ParserError 6913: (86-87): Call or assignment expected.
|
// ParserError 3772: (72-81): Hex literals are not valid in this context.
|
||||||
|
@ -6,4 +6,4 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// ParserError 2314: (70-76): Expected ',' but got 'StringLiteral'
|
// ParserError 3772: (67-76): Hex literals are not valid in this context.
|
||||||
|
@ -8,4 +8,4 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// ParserError 4805: (95-99): Literal expected.
|
// ParserError 3772: (92-99): Hex literals are not valid in this context.
|
||||||
|
@ -21,7 +21,7 @@ contract C {
|
|||||||
let fallback := 1
|
let fallback := 1
|
||||||
// for is a Yul keyword
|
// for is a Yul keyword
|
||||||
// function is a Yul keyword
|
// function is a Yul keyword
|
||||||
let hex := 1
|
// hex is a Yul keyword
|
||||||
// if is a Yul keyword
|
// if is a Yul keyword
|
||||||
let indexed := 1
|
let indexed := 1
|
||||||
let interface := 1
|
let interface := 1
|
||||||
@ -110,4 +110,4 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// Warning 5740: (944-2157): Unreachable code.
|
// Warning 5740: (955-2168): Unreachable code.
|
||||||
|
@ -2,4 +2,4 @@
|
|||||||
let x := hex"0011"
|
let x := hex"0011"
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// ParserError 6913: (25-26): Call or assignment expected.
|
// ParserError 3772: (15-24): Hex literals are not valid in this context.
|
||||||
|
@ -2,4 +2,4 @@
|
|||||||
pop(hex"2233")
|
pop(hex"2233")
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// ParserError 2314: (13-19): Expected ',' but got 'StringLiteral'
|
// ParserError 3772: (10-19): Hex literals are not valid in this context.
|
||||||
|
@ -4,4 +4,4 @@
|
|||||||
case hex"1122" {}
|
case hex"1122" {}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// ParserError 4805: (36-40): Literal expected.
|
// ParserError 3772: (33-40): Hex literals are not valid in this context.
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
let fallback := 1
|
let fallback := 1
|
||||||
// for is a Yul keyword
|
// for is a Yul keyword
|
||||||
// function is a Yul keyword
|
// function is a Yul keyword
|
||||||
let hex := 1
|
// hex is a Yul keyword
|
||||||
// if is a Yul keyword
|
// if is a Yul keyword
|
||||||
let indexed := 1
|
let indexed := 1
|
||||||
let interface := 1
|
let interface := 1
|
||||||
|
Loading…
Reference in New Issue
Block a user