Expose hex literal to the Yul parser

This allows nicer error messages.
This commit is contained in:
Alex Beregszaszi 2020-08-27 15:53:45 +01:00
parent 26a76c18d4
commit 7ef9591e64
12 changed files with 18 additions and 18 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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.");
} }

View File

@ -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)

View File

@ -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.

View File

@ -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.

View File

@ -8,4 +8,4 @@ contract C {
} }
} }
// ---- // ----
// ParserError 4805: (95-99): Literal expected. // ParserError 3772: (92-99): Hex literals are not valid in this context.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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