Author: kjs
Date: Sat Dec 27 05:15:35 2008
New Revision: 34422

Modified:
   trunk/compilers/pirc/new/bcgen.c
   trunk/compilers/pirc/new/main.c
   trunk/compilers/pirc/new/piremit.c

Log:
[pirc] add a parse_string function, which takes a PIR string. 
+ parse_file+parse_string() need to be refactored, but for now this works.
+ add a PARROT_ASSERT on filename in bcgen.c:new_bytecode(); this cannot be 
NULL.

Modified: trunk/compilers/pirc/new/bcgen.c
==============================================================================
--- trunk/compilers/pirc/new/bcgen.c    (original)
+++ trunk/compilers/pirc/new/bcgen.c    Sat Dec 27 05:15:35 2008
@@ -227,6 +227,7 @@
     bc->interp        = interp;
 
     /* create segments */
+    PARROT_ASSERT(filename != NULL);
     interp->code      = PF_create_default_segs(interp, filename, 1);
 
     /* add interpreter globals to bytecode. XXX Why is this? */

Modified: trunk/compilers/pirc/new/main.c
==============================================================================
--- trunk/compilers/pirc/new/main.c     (original)
+++ trunk/compilers/pirc/new/main.c     Sat Dec 27 05:15:35 2008
@@ -220,6 +220,70 @@
 
 /*
 
+Parse a PIR string.
+
+*/
+void
+parse_string(char *pirstring, int flags, int pasminput, unsigned macro_size) {
+    yyscan_t yyscanner;
+    lexer_state *lexer = NULL;
+
+
+    /* create a yyscan_t object */
+    yypirlex_init(&yyscanner);
+
+    yypirset_debug(0, yyscanner);
+
+
+    /* set the extra parameter in the yyscan_t structure */
+    lexer = new_lexer("<pir string>", flags);
+    lexer->macro_size = macro_size;
+    yypirset_extra(lexer, yyscanner);
+    lexer->yyscanner = yyscanner;
+
+    /* initialize the scanner state */
+    init_scanner_state(yyscanner);
+
+    /* set the scanner to a string buffer and go parse */
+    yypir_scan_string(pirstring, yyscanner);
+
+    if (pasminput) { /* PASM mode */
+        SET_FLAG(lexer->flags, LEXER_FLAG_PASMFILE);
+    }
+
+
+    yypirparse(yyscanner, lexer);
+
+    if (lexer->parse_errors == 0) {
+
+        print_subs(lexer);
+
+        if (TEST_FLAG(lexer->flags, LEXER_FLAG_WARNINGS))
+            check_unused_symbols(lexer);
+    }
+
+    /* there may have been errors during the instruction generation, check 
again here. */
+    if (lexer->parse_errors > 0)
+        fprintf(stderr, "There were %d errors\n", lexer->parse_errors);
+
+    /* XXX just want to make sure pirc doesn't segfault when doing bytecode 
stuff. */
+    if (TEST_FLAG(lexer->flags, LEXER_FLAG_OUTPUTPBC)) {
+        emit_pbc(lexer);
+    }
+
+
+    fprintf(stderr, "ok\n");
+    /* clean up after playing */
+    release_resources(lexer);
+
+       /* clean up after playing */
+    yypirlex_destroy(yyscanner);
+
+
+}
+
+/*
+
 temporary function for the thread-testing code.
 Unpack the arguments and invoke parse_file().
 
@@ -269,6 +333,12 @@
     argv++;
 
 
+    /* XXX test the parse_string() function. */
+    /*
+    parse_string(".sub main :main\nprint 42\n.end\n", LEXER_FLAG_OUTPUTPBC, 0, 
INIT_MACRO_SIZE);
+    return 0;
+    */
+
 
     /* XXX very basic argument handling; I'm too lazy to check out
      * the standard funtion for that, right now. This is a TODO. */

Modified: trunk/compilers/pirc/new/piremit.c
==============================================================================
--- trunk/compilers/pirc/new/piremit.c  (original)
+++ trunk/compilers/pirc/new/piremit.c  Sat Dec 27 05:15:35 2008
@@ -9,6 +9,8 @@
 #include "pircompiler.h"
 #include "bcgen.h"
 
+#include "assert.h"
+
 /*
 
 =head1 FUNCTIONS
@@ -542,11 +544,15 @@
     if (lexer->subs == NULL)
         return;
 
+    fprintf(stderr, "emit_pbc(): starting...\n");
+
     lexer->bc = new_bytecode(lexer->interp, lexer->filename,
                              lexer->codesize * 4, lexer->codesize);
 
+    fprintf(stderr, "ok 1\n");
     subiter = lexer->subs->next;
 
+    assert(subiter);
     /* iterate over all instructions and emit them */
     do {
         fprintf(stderr, "start offset of sub '%s' is: %d\tend offest: %d\n",

Reply via email to