]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
Fixed tree-building algorithm and updated clang toolchain settings
authorMichael D. Lowis <mike@mdlowis.com>
Wed, 1 Oct 2014 18:06:35 +0000 (14:06 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Wed, 1 Oct 2014 18:06:35 +0000 (14:06 -0400)
Rakefile
build-system
modules/libcds
source/sclpl/grammar.c
source/sclpl/grammar.h
source/sclpl/lexer.c
source/sclpl/lexer.h
source/sclpl/main.c
source/sclpl/parser.c
source/sclpl/parser.h

index 89c7d610746441e9a92358118bdfc90429022e36..01a8efa1e9f0605ba2316f17132872d293fde8c1 100644 (file)
--- a/Rakefile
+++ b/Rakefile
@@ -10,6 +10,7 @@ end
 # Define the compiler environment
 base_env = BuildEnv.new(echo: :command) do |env|
   env.build_dir('source','build/obj/source')
+  env.build_dir('modules','build/obj/modules')
   env.set_toolset(:clang)
   env["CFLAGS"] += ['-DLEAK_DETECT_LEVEL=1', '--std=c99', '-Wall', '-Wextra'] #, '-Werror']
   env["CPPPATH"] += ['modules/libopts/source'] + Dir['modules/libcds/source/**/']
@@ -35,7 +36,7 @@ end
 
 file "#{CLANG_BIN_DIR}/#{CLANG_BIN_NAME}" => ["#{CLANG_BUILD_DIR}/Makefile"] + FileList["#{CLANG_SRC_DIR}/tools/clang/**/*.c"] do
     FileUtils.cd(CLANG_BUILD_DIR) do
-        sh "#{CLANG_MAKE_CMD} clang"
+        sh "#{CLANG_MAKE_CMD} clang llvm-ar"
     end
 end
 
@@ -79,6 +80,6 @@ task :clean_all => [:clean] do
   end
 end
 
-desc "Clobber the build driectory and all it's contents"
+desc "Clobber the build directory and all it's contents"
 task(:clobber) { FileUtils.rm_rf('build/') }
 
index 81f2a99521abae709ccdeea0640f382908d20b64..02c33d624a63c7d5fa34f116b2209c816d4564da 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 81f2a99521abae709ccdeea0640f382908d20b64
+Subproject commit 02c33d624a63c7d5fa34f116b2209c816d4564da
index a70643a30382932f3eda4d2a5159e81664731bea..20a2ea4fb0e0154f41032c945b25f66069a45a37 160000 (submodule)
@@ -1 +1 @@
-Subproject commit a70643a30382932f3eda4d2a5159e81664731bea
+Subproject commit 20a2ea4fb0e0154f41032c945b25f66069a45a37
index c2a0a79979f63563de993def5c12c4ddd6dd5e1d..9ab652304e22d311181c550009664f1d2c250b2f 100644 (file)
@@ -6,7 +6,7 @@
   */
 #include "grammar.h"
 
-void grammar_toplevel(parser_t* p_parser)
+tree_t* grammar_toplevel(parser_t* p_parser)
 {
     if (parser_accept_str(p_parser, T_VAR, "import"))
         grammar_import(p_parser);
@@ -16,6 +16,7 @@ void grammar_toplevel(parser_t* p_parser)
         grammar_expression(p_parser);
     else
         parser_error(p_parser, "Unrecognized top-level form");
+    return parser_get_tree(p_parser);
 }
 
 void grammar_import(parser_t* p_parser)
index 3ac508894ca119c04b0e6af632750dbf5a7e0636..9c9749bd77a31163ae78025e95b4dd340c466169 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "parser.h"
 
-void grammar_toplevel(parser_t* p_parser);
+tree_t* grammar_toplevel(parser_t* p_parser);
 
 void grammar_import(parser_t* p_parser);
 
index 37cb1fb3d148d2bf392b4f575498d2751660e4e8..b0bafe5946777f130fbf77711090b13663e065a7 100644 (file)
@@ -19,7 +19,6 @@ static lex_tok_t* lexer_integer(char* text, int base);
 static lex_tok_t* lexer_float(char* text);
 static lex_tok_t* lexer_bool(char* text);
 static lex_tok_t* lexer_var(char* text);
-static char* lexer_tok_type_str(lex_tok_t* p_tok);
 static bool lexer_oneof(const char* class, char c);
 static bool is_float(char* text);
 static char* lexer_dup(const char* p_old);
@@ -164,7 +163,7 @@ static lex_tok_t* lexer_var(char* text)
     return lex_tok_new(T_VAR, lexer_dup(text));
 }
 
-static char* lexer_tok_type_str(lex_tok_t* p_tok) {
+char* lexer_tok_type_str(lex_tok_t* p_tok) {
     switch(p_tok->type) {
         case T_END:      return "T_END";
         case T_STRING:   return "T_STRING";
index 5c82acf872fa361a192c2810d0b6427c6c8c1435..e0536b81e2814669f0f859e4c1cb1da2dbc6ed0c 100644 (file)
@@ -33,4 +33,6 @@ lexer_t* lexer_new(char* p_prompt, FILE* p_input);
 
 lex_tok_t* lexer_read(lexer_t* p_lexer);
 
+char* lexer_tok_type_str(lex_tok_t* p_tok);
+
 #endif /* LEXER_H */
index 44a681f8609702438bf4740b2e89db4779a241a0..2aebbb352787d2c992353e64879407c26dffc48c 100644 (file)
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 #include "opts.h"
 #include "grammar.h"
+#include "lexer.h"
 
 /* Command Line Options
  *****************************************************************************/
@@ -14,32 +15,25 @@ OptionConfig_T Options_Config[] = {
 /* SCLPL Parser
  *****************************************************************************/
 
-void print_subtree(tree_t* p_tree, int depth);
-
-void print_tree(vec_t* p_vec, int depth);
+void print_indent(int depth) {
+    for(int i = 0; i < (2 * depth); i++)
+        printf("%c", ' ');
+}
 
-void print_subtree(tree_t* p_tree, int depth) {
-    puts("printing subtree");
-    for(int i = 0; i < (4 * depth); i++) printf("%c", ' ');
+void print_tree(tree_t* p_tree, int depth) {
+    print_indent(depth);
     if (p_tree->tag == ATOM) {
-        printf("ATOM (%p)\n", p_tree);
+        lex_tok_t* p_tok = p_tree->ptr.tok;
+        printf("<token(%s)>\n", lexer_tok_type_str(p_tok));
     } else {
-        printf("TREE (%p)\n", p_tree);
-        print_tree(p_tree->ptr.vec, depth+1);
-    }
-    puts("printed subtree");
-}
-
-void print_tree(vec_t* p_vec, int depth) {
-    puts("printing tree");
-    for(size_t idx = 0; idx < vec_size(p_vec); idx++) {
-        puts("(");
-        tree_t* p_tree = (tree_t*)vec_at(p_vec, idx);
-        puts("-");
-        print_subtree(p_tree, depth);
+        puts("(tree:");
+        vec_t* p_vec = p_tree->ptr.vec;
+        for(size_t idx = 0; idx < vec_size(p_vec); idx++) {
+            print_tree((tree_t*)vec_at(p_vec, idx), depth+1);
+        }
+        print_indent(depth);
         puts(")");
     }
-    puts("printed tree");
 }
 
 /* TODO:
@@ -55,9 +49,9 @@ int main(int argc, char **argv) {
 
     parser_t* p_parser = parser_new(":> ", stdin);
     while(!parser_eof(p_parser)) {
-        grammar_toplevel(p_parser);
-        print_tree(p_parser->p_tok_buf, 0);
-        vec_clear(p_parser->p_tok_buf);
+        tree_t* p_tree = grammar_toplevel(p_parser);
+        print_tree(p_tree, 0);
+        mem_release(p_tree);
         puts("OK.");
     }
     mem_release(p_parser);
index c928de81c857dadcd650a788efa00b49a025295a..94824598180d964c6b10984055ff4ccc667f0bae 100644 (file)
@@ -120,11 +120,16 @@ void parser_reduce(parser_t* p_parser, size_t mark)
     vec_t* p_buf  = p_parser->p_tok_buf;
     vec_t* p_form = vec_new(0);
     for(size_t idx = mark; idx < vec_size(p_buf); idx++) {
-        tree_tag_t tag = ((tree_t*)vec_at(p_buf, idx))->tag;
-        tree_t* p_tree = parser_tree_new(tag, mem_retain(vec_at(p_buf, idx)));
+        tree_t* p_tree = mem_retain(vec_at(p_buf, idx));
         vec_push_back(p_form, p_tree);
     }
-    vec_erase(p_parser->p_tok_buf, mark, vec_size(p_parser->p_tok_buf)-1);
-    vec_push_back(p_parser->p_tok_buf, parser_tree_new(TREE, p_form));
+    vec_erase(p_buf, mark, vec_size(p_buf)-1);
+    vec_push_back(p_buf, parser_tree_new(TREE, p_form));
+}
+
+tree_t* parser_get_tree(parser_t* p_parser) {
+    tree_t* p_tree = parser_tree_new(TREE, p_parser->p_tok_buf);
+    p_parser->p_tok_buf = vec_new(0);
+    return p_tree;
 }
 
index 573354232a645c2859f15c1c7703a757c007986a..0e62b1a851eda26b498e143f664aad44c499ff26 100644 (file)
@@ -48,4 +48,6 @@ size_t parser_mark(parser_t* p_parser);
 
 void parser_reduce(parser_t* p_parser, size_t mark);
 
+tree_t* parser_get_tree(parser_t* p_parser);
+
 #endif /* PARSER_H */