10/20 (Mohit)
-Created Tensor type, qualifier_rettype in AST (qualifier = tensor indices)
-Created InferredBind (a tensor or primitive), TensorBind, and TensorBindAndAssign in AST
-Created rules for tensor immediates
-added LET to declaration rules, sorted out the proper binding nodes for each declaration/assignment
-Added rules for tensor indices on declaration (qual_list, all strings) and tensor indices on indexing into tensor (qual_list_expr, all expressions)
-Added tensors and tensor assignment to expressions
-15 shift/reduce conflicts

10/22 (Elsbeth)
-Added LET ID SEMI rule, which as a note will allow users to declare a variable without any indication of its type
-Added variable declaration to expressions
-Replaced PrimitiveBind with InferredBind as per Mohit's intention
-Reworked tensorimmediate to (1) prevent user from putting tensors and floats in the same list (like [1, [1, 2, 3], 2]) and (2) allow expressions that evaluate to a float to be elements in a tensor as well as floats
-Removed concat and carat
-Reformatted scanner for easier editing
-Forced tensor indices to be in parens unless they're floats or strings to avoid ugly/ambigious syntax like T1_1_2_T2_1 (is T2 a new tensor or a free index? Now we will assume it is an index.)
-1 shift/reduce conflict

10/23 (Eliana and Doni)
-fixed final shift reduce error by removing vdecl_list and only getting variable declarations from stmt_list
-changed tensor index syntax  to T_{1, 2, 3}
-added logo

10/25 (Elsbeth)
-Replaced concat (oops)
-Added new expression block to define what expressions can be tensor indices - removed tensor LITERALS from this list (we can still index into tensors and will need to check the dimensions of the answer in the semantic analyzer to make sure it returns a float and not a tensor slice)
-Allowed expr -> ID (for all 3 expression types, partially so known variables can be used as tensor entries and indices)

11/1 (Eliana and Doni)
-Added int to scanner, parser and ast
-uploaded pipeline from microC to github
  - removed boolean and literal types from codegen.ml	

Pipeline:
	Scanner creates tokens, feeds to Parser
	Parser builds AST with help of Ast
	Semant then checks AST
	Then codegen generates code
Next steps (to get our pipeline to compile) is to add all of our types to
codegen.ml and tell codegen to ignore them, when it matches them. Semant must
also be modified so that anything it checks that is microc-specific (ie
not applicable to LaTenS) is removed. Eliana and I suggest that we create
semant.ml from scratch, taking relevant functions from microc, rather than
using Sedwards' as a base for our own.

Test cases will be used as what they test is added to semant.ml/codegen.ml

TODO:
-respond to comments in scanner.mll
-make pretty printer in ast
-add stuff back to parser



11/17 (Elsbeth, the Great Semant Revolution)
-Added semant skeleton: The stuff returned by semantic analysis will be a SAST (which is an AST
 	but every expression has a type) and a hierarchical environment (which contains the 
	symbol tables for every scope so that codegen can search it for variables if needed.
	The SAST DOES contain sfunc_decl and variable_decl information (we can also include
	scope info if needed) but the symbol tables are included for the actual searching.

11/20 (Doni)
Issues:
1) in func_decl, we have: body : stmt list; (* how is this different than a block? *)
2) we put all global variables in the global environment ... so this means that
regardless of where you define a global, it can be used anywhere?
for example, the following would be valid?:
int getA(){ return a; }
a = 5

- Sast - added Ast. to some of the types in Sast (more may need this prefix)
- Semant - started check_globals function. explained to Elsbeth
	- goal is for it to check for duplicates, get types, make sure they are binds, and then make sure none are void
 - fix everything with (*FIX*)
