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