summaryrefslogtreecommitdiff
path: root/src/runtime/c
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/c')
-rw-r--r--src/runtime/c/pgf/lexer.c46
-rw-r--r--src/runtime/c/pgf/lexer.h7
-rw-r--r--src/runtime/c/pgf/pgf.c30
-rw-r--r--src/runtime/c/pgf/pgf.h3
-rw-r--r--src/runtime/c/utils/pgf-chunk.c2
-rw-r--r--src/runtime/c/utils/pgf-parse.c2
-rw-r--r--src/runtime/c/utils/pgf-translate.c2
7 files changed, 38 insertions, 54 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
diff --git a/src/runtime/c/utils/pgf-chunk.c b/src/runtime/c/utils/pgf-chunk.c
index fada1c0b4..5f4b8972a 100644
--- a/src/runtime/c/utils/pgf-chunk.c
+++ b/src/runtime/c/utils/pgf-chunk.c
@@ -98,7 +98,7 @@ int main(int argc, char* argv[]) {
GuReader *rdr =
gu_string_reader(gu_str_string(line, ppool), ppool);
PgfLexer *lexer =
- pgf_new_lexer(rdr, ppool);
+ pgf_new_simple_lexer(rdr, ppool);
pgf_print_chunks(from_concr, cat, lexer, ppool);
diff --git a/src/runtime/c/utils/pgf-parse.c b/src/runtime/c/utils/pgf-parse.c
index 4e1444806..648295312 100644
--- a/src/runtime/c/utils/pgf-parse.c
+++ b/src/runtime/c/utils/pgf-parse.c
@@ -123,7 +123,7 @@ int main(int argc, char* argv[]) {
}
GuReader *rdr = gu_string_reader(gu_str_string(line, ppool), ppool);
- PgfLexer *lexer = pgf_new_lexer(rdr, ppool);
+ PgfLexer *lexer = pgf_new_simple_lexer(rdr, ppool);
GuEnum* result = pgf_parse(concr, cat, lexer, ppool);
PgfExprProb* ep = NULL;
diff --git a/src/runtime/c/utils/pgf-translate.c b/src/runtime/c/utils/pgf-translate.c
index ea3cca5af..ac427cb0e 100644
--- a/src/runtime/c/utils/pgf-translate.c
+++ b/src/runtime/c/utils/pgf-translate.c
@@ -164,7 +164,7 @@ int main(int argc, char* argv[]) {
GuReader *rdr =
gu_string_reader(gu_str_string(line, ppool), ppool);
PgfLexer *lexer =
- pgf_new_lexer(rdr, ppool);
+ pgf_new_simple_lexer(rdr, ppool);
clock_t start = clock();