return tk;
}
prev = ch;
- if (prev == '/')
- save_unget_state(state);
+ save_unget_state(state);
ch = get_char(state);
if (!(ignored && (1<<TK_string)) && is_quote(ch))
break;
- if (!(ignored && (1<<TK_line_comment)) &&
- prev == '/' && ch == '/') {
+ if (prev == '#')
+ break;
+ if (prev == '/' && ch == '/' && tk.txt.len > 1) {
restore_unget_state(state);
break;
}
- if (!(ignored && (1<<TK_block_comment)) &&
- prev == '/' && ch == '*') {
+ if (prev == '/' && ch == '*' && tk.txt.len > 1) {
restore_unget_state(state);
break;
}
}
unget_char(state);
- if (tk.num != TK_error)
+ if (tk.num != TK_error) {
+ close_token(state, &tk);
return tk;
+ }
+
+If we don't find a known mark, we will check for strings and comments
+before assuming that we have an unknown mark
+
+###### parse mark
+ ## parse string
+ ## parse comment
+ ## unknown mark
###### unknown mark
if (tk.txt.len) {
* unget so the newline is seen,
* but return rest of string as an error.
*/
- unget_char(state);
+ if (is_newline(ch))
+ unget_char(state);
close_token(state, &tk);
tk.num = TK_error;
return tk;
!(ignored & (1<<TK_string))) {
wchar_t first = tk.txt.txt[0];
reset_token(state, &tk);
- get_char(state);
- do
+ ch = get_char(state);
+ tk.num = TK_error;
+ while (!at_eon(state) && !is_newline(ch)) {
ch = get_char(state);
- while (ch != first && !is_newline(ch));
- tk.num = TK_string;
- if (is_newline(ch)) {
- unget_char(state);
- tk.num = TK_error;
+ if (ch == first) {
+ tk.num = TK_string;
+ break;
+ }
+ if (is_newline(ch)) {
+ unget_char(state);
+ break;
+ }
}
close_token(state, &tk);
return tk;
These two comment types are reported as two separate token types, and
consequently can be ignored separately. When ignored a comment is
-parsed and discarded.
+still parsed, but is discarded.
###### token types
TK_line_comment,
#### Single line comments
-A single-line comment continues up to, but not including the newline.
+A single-line comment continues up to, but not including the newline
+or end of node.
###### parse comment
if (is_line_comment(tk.txt)) {
- while (!is_newline(ch))
+ while (!is_newline(ch) && !at_eon(state))
ch = get_char(state);
- unget_char(state);
+ if (is_newline(ch))
+ unget_char(state);
close_token(state, &tk);
tk.num = TK_line_comment;
if (ignored & (1 << TK_line_comment))
## parse number
## parse word
## parse mark
- ## parse string
- ## parse comment
- ## unknown mark
### Start and stop