static int parse_action_label(struct peg_grammar_parser *pgp, struct peg_cursor *pc, struct raw *r) { struct peg_cursor npc = *pc; size_t len; if ( !string_match(pgp, ":", &npc) ) return 0; if ( !cset_contains(cs_id_start, CHAR(pgp, &npc)) ) return 0; len = 1 + str_spn(STR(pgp, &npc) + 1, cs_id_cont); if ( copy_str(pgp, &npc, len, r) < 0 ) return -1; npc.pos += len; *pc = npc; skip_space(pgp, pc); return 1; }
static int parse_id(struct peg_grammar_parser *pgp, struct peg_cursor *pc, int *idp) { int id; struct peg_node *pn; struct peg_grammar *peg = pgp->peg; struct raw name; if ( !cset_contains(cs_id_start, CHAR(pgp, pc)) ) return 0; name.data = (char *)STR(pgp, pc); name.len = 1 + str_spn(name.data + 1, cs_id_cont); pn = find_id(peg, &name); if ( pn != NULL ) { ++pn->pi_refcnt; } else { id = peg_node_new(peg, PEG_IDENTIFIER, pc->line); if ( id < 0 ) { pgp->err = PEG_ERR_NOMEM; return -1; } pn = NODE(peg, id); if ( copy_str(pgp, pc, name.len, &pn->pi_name) < 0 ) { pgp->err = PEG_ERR_NOMEM; peg_node_free(peg, id); return -1; } pn->pi_def = -1; pn->pi_refcnt = 1; } *idp = node2idx(peg, pn); pc->pos += name.len; skip_space(pgp, pc); return 1; }
static int parse_code(struct peg_grammar_parser *pgp, struct peg_cursor *pc, struct raw *r) { struct peg_cursor npc = *pc; uint n; uint brace_depth; size_t len; if ( CHAR(pgp, &npc) != '{' ) return 0; npc.pos += 1; brace_depth = 1; do { n = str_spn(STR(pgp, &npc), cs_ccode); npc.pos += n; if ( CHAR(pgp, &npc) == '"' ) { /* parse double quote */ npc.pos += 1; while ( CHAR(pgp, &npc) != '"' ) { if ( CHAR(pgp, &npc) == '\r' ) { npc.pos += 1; npc.line += 1; if ( CHAR(pgp, &npc) == '\n' ) npc.pos += 1; } else if ( CHAR(pgp, &npc) == '\n' ) { npc.pos += 1; npc.line += 1; } else if ( CHAR(pgp, &npc) == '\\' ) { npc.pos += 1; if ( parse_slash_char(pgp, &npc) < 0 ) goto err; } else if ( CHAR(pgp, &npc) == '\0' ) { goto err; } else { npc.pos += 1; } } npc.pos += 1; } else if ( CHAR(pgp, &npc) == '\'' ) { /* parse single quote char */ npc.pos += 1; if ( CHAR(pgp, &npc) == '\\' ) { npc.pos += 1; if ( parse_slash_char(pgp, &npc) < 0 ) goto err; } else { npc.pos += 1; } if ( CHAR(pgp, &npc) != '\'' ) goto err; npc.pos += 1; } else if ( CHAR(pgp, &npc) == '/' ) { if ( CHARI(pgp, &npc, 1) != '*' ) { npc.pos += 1; continue; } /* parse comment */ npc.pos += 2; while ( CHAR(pgp, &npc) != '*' || CHARI(pgp, &npc, 1) != '/' ) { if ( CHAR(pgp, &npc) == '\r' ) { npc.pos += 1; npc.line += 1; if ( CHAR(pgp, &npc) == '\n' ) npc.pos += 1; } else if ( CHAR(pgp, &npc) == '\n' ) { npc.pos += 1; npc.line += 1; } else if ( CHAR(pgp, &npc) == '\0' ) { goto err; } else { npc.pos += 1; } } npc.pos += 2; } else if ( CHAR(pgp, &npc) == '\r' ) { npc.pos += 1; npc.line += 1; if ( CHAR(pgp, &npc) == '\n' ) npc.pos += 1; } else if ( CHAR(pgp, &npc) == '\n' ) { npc.pos += 1; npc.line += 1; } else if ( CHAR(pgp, &npc) == '\0' ) { goto err; } else if ( CHAR(pgp, &npc) == '{' ) { brace_depth += 1; npc.pos += 1; } else if ( CHAR(pgp, &npc) == '}' ) { brace_depth -= 1; npc.pos += 1; } else { abort_unless(0); /* should never happen! */ } } while ( brace_depth > 0 ); len = npc.pos - pc->pos; if ( copy_str(pgp, pc, len, r) < 0 ) return -1; *pc = npc; skip_space(pgp, pc); return 1; err: pgp->err = PEG_ERR_BAD_CODE; pgp->eloc = npc; return -1; }
TSFReader::TSFReader(const char* fname, char sep, i32 nfrq) // if sep == ' ' isspace will be imitated (for compat) : Split(str_spn(sep == ' ' ? "\t\n\v\f\r " : ~Stroka(sep)), sep == ' ') , OpenPipe(false) { Open(fname, nfrq); }