| ... | ... | @@ -136,6 +136,8 @@ enum TokenizeState { |
| 136 | 136 | TokenizeStateRawStringContents, |
| 137 | 137 | TokenizeStateRawStringMaybeEnd, |
| 138 | 138 | TokenizeStateCharLiteral, |
| 139 | TokenizeStateCharLiteralEscape, |
| 140 | TokenizeStateCharLiteralEnd, |
| 139 | 141 | TokenizeStateSawStar, |
| 140 | 142 | TokenizeStateSawSlash, |
| 141 | 143 | TokenizeStateSawPercent, |
| ... | ... | @@ -955,10 +957,27 @@ void tokenize(Buf *buf, Tokenization *out) { |
| 955 | 957 | end_token(&t); |
| 956 | 958 | t.state = TokenizeStateStart; |
| 957 | 959 | break; |
| 960 | case '\\': |
| 961 | t.state = TokenizeStateCharLiteralEscape; |
| 962 | break; |
| 958 | 963 | default: |
| 964 | t.state = TokenizeStateCharLiteralEnd; |
| 959 | 965 | break; |
| 960 | 966 | } |
| 961 | 967 | break; |
| 968 | case TokenizeStateCharLiteralEscape: |
| 969 | t.state = TokenizeStateCharLiteralEnd; |
| 970 | break; |
| 971 | case TokenizeStateCharLiteralEnd: |
| 972 | switch (c) { |
| 973 | case '\'': |
| 974 | end_token(&t); |
| 975 | t.state = TokenizeStateStart; |
| 976 | break; |
| 977 | default: |
| 978 | tokenize_error(&t, "invalid character: '%c'", c); |
| 979 | } |
| 980 | break; |
| 962 | 981 | case TokenizeStateZero: |
| 963 | 982 | switch (c) { |
| 964 | 983 | case 'b': |
| ... | ... | @@ -1118,6 +1137,8 @@ void tokenize(Buf *buf, Tokenization *out) { |
| 1118 | 1137 | tokenize_error(&t, "unterminated raw string"); |
| 1119 | 1138 | break; |
| 1120 | 1139 | case TokenizeStateCharLiteral: |
| 1140 | case TokenizeStateCharLiteralEscape: |
| 1141 | case TokenizeStateCharLiteralEnd: |
| 1121 | 1142 | tokenize_error(&t, "unterminated character literal"); |
| 1122 | 1143 | break; |
| 1123 | 1144 | case TokenizeStateSymbol: |