示例#1
0
文件: peg.c 项目: ctelfer/catlib
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;
}
示例#2
0
文件: peg.c 项目: ctelfer/catlib
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;
}
示例#3
0
文件: peg.c 项目: ctelfer/catlib
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;
}
示例#4
0
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);
}