Skip to content

Commit 8307234

Browse files
authored
Implement quoted identifier parsing (#2715)
Part of annotations and WebAssembly 3.0.
1 parent faa52c9 commit 8307234

File tree

7 files changed

+227
-80
lines changed

7 files changed

+227
-80
lines changed

include/wabt/wast-lexer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class WastLexer {
8989
return ReadReservedChars() == ReservedChars::None;
9090
}
9191
void ReadSign();
92-
Token GetStringToken();
92+
Token GetStringToken(TokenType);
9393
Token GetNumberToken(TokenType);
9494
Token GetHexNumberToken(TokenType);
9595
Token GetInfToken();

include/wabt/wast-parser.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ class WastParser {
132132
// Returns true if the next two tokens are form reference type - (ref $t)
133133
bool PeekMatchRefType();
134134

135+
// Returns true if the next token represents a var.
136+
bool PeekMatchVar();
137+
135138
// Returns true if the next token's type is equal to the parameter. If so,
136139
// then the token is consumed.
137140
bool Match(TokenType);
@@ -159,17 +162,18 @@ class WastParser {
159162
// synchronized.
160163
Result Synchronize(SynchronizeFunc);
161164

162-
bool ParseBindVarOpt(std::string* name);
165+
Result ParseVarText(Token& token, std::string* out_text);
166+
Result ParseBindVarOpt(std::string* name);
163167
Result ParseVar(Var* out_var);
164-
bool ParseVarOpt(Var* out_var, Var default_var = Var());
168+
Result ParseVarOpt(Var* out_var, Var default_var = Var());
165169
Result ParseOffsetExpr(ExprList* out_expr_list);
166170
bool ParseOffsetExprOpt(ExprList* out_expr_list);
167171
Result ParseTextList(std::vector<uint8_t>* out_data);
168172
bool ParseTextListOpt(std::vector<uint8_t>* out_data);
169173
Result ParseVarList(VarVector* out_var_list);
170174
bool ParseElemExprOpt(ExprList* out_elem_expr);
171175
bool ParseElemExprListOpt(ExprListVector* out_list);
172-
bool ParseElemExprVarListOpt(ExprListVector* out_list);
176+
Result ParseElemExprVarListOpt(ExprListVector* out_list);
173177
Result ParseRefDeclaration(Var* out_type);
174178
Result ParseValueType(Var* out_type);
175179
Result ParseValueTypeList(

src/wast-lexer.cc

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ Token WastLexer::GetToken() {
111111
continue;
112112

113113
case '"':
114-
return GetStringToken();
114+
return GetStringToken(TokenType::Text);
115115

116116
case '+':
117117
case '-':
@@ -158,6 +158,10 @@ Token WastLexer::GetToken() {
158158
return GetNumberToken(TokenType::Nat);
159159

160160
case '$':
161+
ReadChar();
162+
if (PeekChar() == '"') {
163+
return GetStringToken(TokenType::Var);
164+
}
161165
return GetIdChars(); // Initial $ is idchar, so this produces id token
162166

163167
case 'a':
@@ -319,7 +323,7 @@ void WastLexer::ReadWhitespace() {
319323
}
320324
}
321325

322-
Token WastLexer::GetStringToken() {
326+
Token WastLexer::GetStringToken(TokenType token_type) {
323327
const char* saved_token_start = token_start_;
324328
bool has_error = false;
325329
bool in_string = true;
@@ -437,7 +441,7 @@ Token WastLexer::GetStringToken() {
437441
return Token(GetLocation(), TokenType::Invalid);
438442
}
439443

440-
return TextToken(TokenType::Text);
444+
return TextToken(token_type);
441445
}
442446

443447
// static
@@ -497,7 +501,7 @@ WastLexer::ReservedChars WastLexer::ReadReservedChars() {
497501
ret = ReservedChars::Id;
498502
}
499503
} else if (peek == '"') {
500-
GetStringToken();
504+
GetStringToken(TokenType::Text);
501505
ret = ReservedChars::Some;
502506
} else {
503507
break;
@@ -602,7 +606,7 @@ Token WastLexer::GetNameEqNumToken(std::string_view name,
602606
}
603607

604608
Token WastLexer::GetIdChars() {
605-
if (ReadReservedChars() == ReservedChars::Id) {
609+
if (ReadReservedChars() != ReservedChars::Some) {
606610
return TextToken(TokenType::Var);
607611
}
608612

0 commit comments

Comments
 (0)