diff options
Diffstat (limited to 'src/runtime/c/pgf')
| -rw-r--r-- | src/runtime/c/pgf/lexer.c | 46 | ||||
| -rw-r--r-- | src/runtime/c/pgf/lexer.h | 7 | ||||
| -rw-r--r-- | src/runtime/c/pgf/pgf.c | 30 | ||||
| -rw-r--r-- | src/runtime/c/pgf/pgf.h | 3 |
4 files changed, 35 insertions, 51 deletions
diff --git a/src/runtime/c/pgf/lexer.c b/src/runtime/c/pgf/lexer.c index 15caab151..d50098072 100644 --- a/src/runtime/c/pgf/lexer.c +++ b/src/runtime/c/pgf/lexer.c @@ -3,26 +3,15 @@ #include <pgf/data.h> #include <wctype.h> -struct PgfLexer { +typedef struct { + PgfLexer base; GuReader* rdr; GuPool* pool; GuUCS ucs; - PgfToken tok; -}; - -PgfLexer* -pgf_new_lexer(GuReader *rdr, GuPool *pool) -{ - PgfLexer* lexer = gu_new(PgfLexer, pool); - lexer->rdr = rdr; - lexer->pool = pool; - lexer->ucs = ' '; - lexer->tok = gu_empty_string; - return lexer; -} +} PgfSimpleLexer; static void -pgf_lexer_read_ucs(PgfLexer *lexer, GuExn* err) +pgf_lexer_read_ucs(PgfSimpleLexer *lexer, GuExn* err) { lexer->ucs = gu_read_ucs(lexer->rdr, err); if (gu_exn_is_raised(err)) { @@ -31,9 +20,10 @@ pgf_lexer_read_ucs(PgfLexer *lexer, GuExn* err) } } -PgfToken -pgf_lexer_read_token(PgfLexer *lexer, GuExn* err) +static PgfToken +pgf_simple_lexer_read_token(PgfLexer *base, GuExn* err) { + PgfSimpleLexer* lexer = (PgfSimpleLexer*) base; GuPool* tmp_pool = gu_new_pool(); GuStringBuf* buf = gu_string_buf(tmp_pool); @@ -107,10 +97,28 @@ pgf_lexer_read_token(PgfLexer *lexer, GuExn* err) } stop: - lexer->tok = gu_string_buf_freeze(buf, lexer->pool); + lexer->base.tok = gu_string_buf_freeze(buf, lexer->pool); gu_pool_free(tmp_pool); - return lexer->tok; + return lexer->base.tok; +} + +PgfLexer* +pgf_new_simple_lexer(GuReader *rdr, GuPool *pool) +{ + PgfSimpleLexer* lexer = gu_new(PgfSimpleLexer, pool); + lexer->base.read_token = pgf_simple_lexer_read_token; + lexer->base.tok = gu_empty_string; + lexer->rdr = rdr; + lexer->pool = pool; + lexer->ucs = ' '; + return ((PgfLexer*) lexer); +} + +PgfToken +pgf_lexer_read_token(PgfLexer *lexer, GuExn* err) +{ + return lexer->read_token(lexer, err); } PgfToken diff --git a/src/runtime/c/pgf/lexer.h b/src/runtime/c/pgf/lexer.h index 6f01d4d10..f89629cea 100644 --- a/src/runtime/c/pgf/lexer.h +++ b/src/runtime/c/pgf/lexer.h @@ -6,10 +6,13 @@ /// A single lexical token typedef GuString PgfToken; -typedef struct PgfLexer PgfLexer; +typedef struct { + PgfToken (*read_token)(); + PgfToken tok; +} PgfLexer; PgfLexer* -pgf_new_lexer(GuReader *rdr, GuPool *pool); +pgf_new_simple_lexer(GuReader *rdr, GuPool *pool); PgfToken pgf_lexer_read_token(PgfLexer *lexer, GuExn* err); diff --git a/src/runtime/c/pgf/pgf.c b/src/runtime/c/pgf/pgf.c index 2b720f093..6c6872867 100644 --- a/src/runtime/c/pgf/pgf.c +++ b/src/runtime/c/pgf/pgf.c @@ -223,37 +223,13 @@ pgf_parse(PgfConcr* concr, PgfCId cat, PgfLexer *lexer, GuPool* pool) tok = pgf_lexer_read_token(lexer, lex_err); } + if (gu_exn_caught(lex_err) != gu_type(GuEOF)) + return NULL; + // Now begin enumerating the resulting syntax trees return pgf_parse_result(state, pool); } -// Same as previous but accept a list of tokens as input instead of a -// lexer -GuEnum* -pgf_parse_tokens(PgfConcr* concr, PgfCId cat, char **tokens, int len, GuPool* pool) -{ - // Begin parsing a sentence of the specified category - PgfParseState* state = - pgf_parser_init_state(concr, cat, 0, pool); - if (state == NULL) { - return NULL; - } - - // Parsing - PgfToken tok; - for (int i = 0; i < len; i++) { - tok = gu_str_string(tokens[i], pool); - - state = pgf_parser_next_state(state, tok, pool); - if (state == NULL) { - return NULL; - } - } - - // Now begin enumerating the resulting syntax trees - return pgf_parse_result(state, pool); -} - void pgf_print_chunks(PgfConcr* concr, PgfCId cat, PgfLexer *lexer, GuPool* pool) { diff --git a/src/runtime/c/pgf/pgf.h b/src/runtime/c/pgf/pgf.h index afef6ec48..1f3947bff 100644 --- a/src/runtime/c/pgf/pgf.h +++ b/src/runtime/c/pgf/pgf.h @@ -116,9 +116,6 @@ PgfExprEnum* pgf_parse(PgfConcr* concr, PgfCId cat, PgfLexer *lexer, GuPool* pool); PgfExprEnum* -pgf_parse_tokens(PgfConcr* concr, PgfCId cat, char* tokens[], int len, GuPool* pool); - -PgfExprEnum* pgf_generate(PgfPGF* pgf, PgfCId cat, GuPool* pool); // an experimental function. Please don't use it |
