diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2013-10-08 15:00:42 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2013-10-08 15:00:42 +0000 |
| commit | ebb5737c0ef398019d1b331313a133aa13971389 (patch) | |
| tree | afa0660c983d04b145802d9a3fec0184fae42543 /src/runtime/c | |
| parent | 977d309e3c117b3d7ffcba35eba204253f6b45ec (diff) | |
fix the robust parser after the change of GuString
Diffstat (limited to 'src/runtime/c')
| -rw-r--r-- | src/runtime/c/pgf/parser.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/src/runtime/c/pgf/parser.c b/src/runtime/c/pgf/parser.c index 69ecc093b..0ab757a62 100644 --- a/src/runtime/c/pgf/parser.c +++ b/src/runtime/c/pgf/parser.c @@ -145,7 +145,28 @@ GU_DEFINE_TYPE(PgfLeftcornerTokIdx, GuStringMap, static PgfSymbol pgf_prev_extern_sym(PgfSymbol sym) { - return *(((PgfSymbol*) gu_variant_data(sym))-1); + GuVariantInfo i = gu_variant_open(sym); + switch (i.tag) { + case PGF_SYMBOL_CAT: + return *((PgfSymbol*) (((PgfSymbolCat*) i.data)+1)); + case PGF_SYMBOL_KP: + return *((PgfSymbol*) (((PgfSymbolKP*) i.data)+1)); + case PGF_SYMBOL_KS: + PgfSymbolKS* sks = (PgfSymbolKS*) i.data; + size_t tok_len = strlen(sks->token); + return *((PgfSymbol*) (((uint8_t*) sks)+sizeof(PgfSymbolKS)+tok_len+1)); + case PGF_SYMBOL_LIT: + return *((PgfSymbol*) (((PgfSymbolLit*) i.data)+1)); + case PGF_SYMBOL_VAR: + return *((PgfSymbol*) (((PgfSymbolVar*) i.data)+1)); + case PGF_SYMBOL_BIND: + return *((PgfSymbol*) (((PgfSymbolBIND*) i.data)+1)); + case PGF_SYMBOL_NE: + return *((PgfSymbol*) (((PgfSymbolNE*) i.data)+1)); + default: + gu_impossible(); + return gu_null_variant; + } } size_t @@ -1115,13 +1136,14 @@ pgf_parsing_meta_scan(PgfParseState* before, PgfParseState* after, item->inside_prob += meta_prob; PgfSymbol prev = item->curr_sym; + size_t tok_len = strlen(tok); PgfSymbolKS* sks = (PgfSymbolKS*) gu_alloc_variant(PGF_SYMBOL_KS, - sizeof(PgfSymbol)+sizeof(PgfSymbolKS)+strlen(tok)+1, + sizeof(PgfSymbolKS)+tok_len+1+sizeof(PgfSymbol), gu_alignof(PgfSymbolKS), &item->curr_sym, after->ps->pool); - *(((PgfSymbol*) sks)-1) = prev; strcpy((char*) sks->token, (char*) tok); + *((PgfSymbol*) (((uint8_t*) sks)+sizeof(PgfSymbolKS)+tok_len+1)) = prev; gu_buf_heap_push(before->agenda, &pgf_item_prob_order, &item); } @@ -1176,10 +1198,10 @@ pgf_parsing_meta_predict(GuMapItor* fn, const void* key, void* value, GuExn* err sizeof(PgfSymbolCat)+sizeof(PgfSymbol), gu_alignof(PgfSymbolCat), &item->curr_sym, state->ps->pool); - *(((PgfSymbol*)scat)-1) = prev; + *((PgfSymbol*) (scat+1)) = prev; scat->d = nargs; scat->r = lin_idx; - + gu_buf_heap_push(state->agenda, &pgf_item_prob_order, &item); } } @@ -1413,13 +1435,14 @@ pgf_parsing_item(PgfParseState* before, PgfParseState* after, PgfItem* item) if (accepted) { if (after != NULL) { PgfSymbol prev = item->curr_sym; + size_t tok_len = strlen(tok); PgfSymbolKS* sks = (PgfSymbolKS*) gu_alloc_variant(PGF_SYMBOL_KS, - sizeof(PgfSymbol)+sizeof(PgfSymbolKS)+strlen(tok)+1, + sizeof(PgfSymbol)+sizeof(PgfSymbolKS)+tok_len+1, gu_alignof(PgfSymbolKS), &item->curr_sym, after->ps->pool); - *(((PgfSymbol*) sks)-1) = prev; strcpy((char*) sks->token, (char*) tok); + *((PgfSymbol*) (((uint8_t*) sks)+sizeof(PgfSymbolKS)+tok_len+1)) = prev; item->seq_idx++; pgf_parsing_add_transition(before, after, tok, item); |
