main.cc
changeset 0 fb772792efd1
child 46 fc1b78ea6d84
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cc	Wed Jan 31 15:32:38 2007 +0100
@@ -0,0 +1,133 @@
+/*
+ * (c) 2003 Mario de Sousa
+ *
+ * Offered to the public under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * This code is made available on the understanding that it will not be
+ * used in safety-critical situations without a full and competent review.
+ */
+
+/*
+ * An IEC 61131-3 IL and ST compiler.
+ *
+ * Based on the
+ * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
+ *
+ */
+
+/*
+ ****************************************************************
+ ****************************************************************
+ ****************************************************************
+ *********                                              *********
+ *********                                              *********
+ *********   O V E R A L L    A R C H I T E C T U R E   *********
+ *********                                              *********
+ *********                                              *********
+ ****************************************************************
+ ****************************************************************
+ ****************************************************************
+
+ The compiler works in 4(+1) stages:
+ Stage 1   - Lexical analyser      - implemented with flex (iec.flex)
+ Stage 2   - Syntax parser         - implemented with bison (iec.y)
+ Stage 3   - Semantics analyser    - not yet implemented
+ Stage 4   - Code generator        - implemented in C++
+ Stage 4+1 - Binary code generator - gcc, javac, etc...
+
+
+ Data structures passed between stages, in global variables:
+ 1->2   : tokens (int), and token values (char *)
+ 2->1   : symbol tables (defined in symtable.hh)
+ 2->3   : abstract syntax tree (tree of C++ classes, in absyntax.hh file)
+ 3->4   : Same as 2->3
+ 4->4+1 : file with program in c, java, etc...
+
+
+ The compiler works in several passes:
+ Pass 1: executes stages 1 and 2 simultaneously
+ Pass 2: executes stage 3
+ Pass 3: executes stage 4
+ Pass 4: executes stage 4+1
+*/
+
+
+
+//#include <stdio.h>   // printf()
+
+#include <stdlib.h>  // EXIT_FAILURE
+#include "absyntax/absyntax.hh"  // symbol_c type
+
+
+
+
+/* A macro for printing out internal parser errors... */
+#include <iostream> // required for std::cerr
+#define ERROR error_exit(__FILE__,__LINE__)
+void error_exit(const char *file_name, int line_no) {
+  std::cerr << "\nInternal program error in file " << file_name
+            << " at line " << line_no << "\n\n\n";
+  exit(EXIT_FAILURE);
+}
+
+
+
+/* forward declarations... */
+int stage1_2(const char *filename, const char *includedir, symbol_c **tree_root);
+//int stage3(symbol_c *tree_root);
+int stage4(symbol_c *tree_root);
+
+
+static void printusage(const char *cmd) {
+  printf("%s [<input_file>] [-I <include_directory>]\n", cmd);
+}
+
+
+
+int main(int argc, char **argv) {
+  symbol_c *tree_root;
+  char * includedir = NULL;
+
+  if (argc == 4) {
+    if (strcmp(argv[2], "-I") != 0) {
+      printusage(argv[0]);
+      return EXIT_FAILURE;
+    }
+    includedir = argv[3];
+    argc = 2;
+  }
+
+  if (argc != 2) {
+    printusage(argv[0]);
+    return EXIT_FAILURE;
+  }
+
+  /* 1st Pass */
+  if (stage1_2(argv[1], includedir, &tree_root) < 0)
+    return EXIT_FAILURE;
+
+  /* 2nd Pass */
+  /* not yet implemented... */
+  /*
+  if (stage3(tree_root) < 0)
+    return EXIT_FAILURE;
+  */
+
+  /* 3rd Pass */
+  if (stage4(tree_root) < 0)
+    return EXIT_FAILURE;
+
+  /* 4th Pass */
+  /* Currently implemented in the Makefile! */
+
+  return 0;
+}
+
+