diff --git a/docs/tutorial/LangImpl2.html b/docs/tutorial/LangImpl2.html
index 50eed96..edf19a8 100644
--- a/docs/tutorial/LangImpl2.html
+++ b/docs/tutorial/LangImpl2.html
@@ -294,12 +294,12 @@
 <div class="doc_code">
 <pre>
 /// identifierexpr
-///   ::= identifer
-///   ::= identifer '(' expression* ')'
+///   ::= identifier
+///   ::= identifier '(' expression* ')'
 static ExprAST *ParseIdentifierExpr() {
   std::string IdName = IdentifierStr;
   
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '(') // Simple variable ref.
     return new VariableExprAST(IdName);
@@ -954,12 +954,12 @@
 static ExprAST *ParseExpression();
 
 /// identifierexpr
-///   ::= identifer
-///   ::= identifer '(' expression* ')'
+///   ::= identifier
+///   ::= identifier '(' expression* ')'
 static ExprAST *ParseIdentifierExpr() {
   std::string IdName = IdentifierStr;
   
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '(') // Simple variable ref.
     return new VariableExprAST(IdName);
diff --git a/docs/tutorial/LangImpl3.html b/docs/tutorial/LangImpl3.html
index 4209327..e16d1be 100644
--- a/docs/tutorial/LangImpl3.html
+++ b/docs/tutorial/LangImpl3.html
@@ -818,12 +818,12 @@
 static ExprAST *ParseExpression();
 
 /// identifierexpr
-///   ::= identifer
-///   ::= identifer '(' expression* ')'
+///   ::= identifier
+///   ::= identifier '(' expression* ')'
 static ExprAST *ParseIdentifierExpr() {
   std::string IdName = IdentifierStr;
   
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '(') // Simple variable ref.
     return new VariableExprAST(IdName);
diff --git a/docs/tutorial/LangImpl4.html b/docs/tutorial/LangImpl4.html
index 8c25a04..6fb2c88 100644
--- a/docs/tutorial/LangImpl4.html
+++ b/docs/tutorial/LangImpl4.html
@@ -686,12 +686,12 @@
 static ExprAST *ParseExpression();
 
 /// identifierexpr
-///   ::= identifer
-///   ::= identifer '(' expression* ')'
+///   ::= identifier
+///   ::= identifier '(' expression* ')'
 static ExprAST *ParseIdentifierExpr() {
   std::string IdName = IdentifierStr;
   
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '(') // Simple variable ref.
     return new VariableExprAST(IdName);
diff --git a/docs/tutorial/LangImpl5.html b/docs/tutorial/LangImpl5.html
index a1146ed..09477fa 100644
--- a/docs/tutorial/LangImpl5.html
+++ b/docs/tutorial/LangImpl5.html
@@ -574,7 +574,7 @@
 
 <div class="doc_code">
 <pre>
-/// forexpr ::= 'for' identifer '=' expr ',' expr (',' expr)? 'in' expression
+/// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
 static ExprAST *ParseForExpr() {
   getNextToken();  // eat the for.
 
@@ -582,7 +582,7 @@
     return Error("expected identifier after for");
   
   std::string IdName = IdentifierStr;
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '=')
     return Error("expected '=' after for");
@@ -1085,12 +1085,12 @@
 static ExprAST *ParseExpression();
 
 /// identifierexpr
-///   ::= identifer
-///   ::= identifer '(' expression* ')'
+///   ::= identifier
+///   ::= identifier '(' expression* ')'
 static ExprAST *ParseIdentifierExpr() {
   std::string IdName = IdentifierStr;
   
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '(') // Simple variable ref.
     return new VariableExprAST(IdName);
@@ -1163,7 +1163,7 @@
   return new IfExprAST(Cond, Then, Else);
 }
 
-/// forexpr ::= 'for' identifer '=' expr ',' expr (',' expr)? 'in' expression
+/// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
 static ExprAST *ParseForExpr() {
   getNextToken();  // eat the for.
 
@@ -1171,7 +1171,7 @@
     return Error("expected identifier after for");
   
   std::string IdName = IdentifierStr;
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '=')
     return Error("expected '=' after for");
diff --git a/docs/tutorial/LangImpl6.html b/docs/tutorial/LangImpl6.html
index 90f02ab..5a184c2 100644
--- a/docs/tutorial/LangImpl6.html
+++ b/docs/tutorial/LangImpl6.html
@@ -1048,12 +1048,12 @@
 static ExprAST *ParseExpression();
 
 /// identifierexpr
-///   ::= identifer
-///   ::= identifer '(' expression* ')'
+///   ::= identifier
+///   ::= identifier '(' expression* ')'
 static ExprAST *ParseIdentifierExpr() {
   std::string IdName = IdentifierStr;
   
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '(') // Simple variable ref.
     return new VariableExprAST(IdName);
@@ -1126,7 +1126,7 @@
   return new IfExprAST(Cond, Then, Else);
 }
 
-/// forexpr ::= 'for' identifer '=' expr ',' expr (',' expr)? 'in' expression
+/// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
 static ExprAST *ParseForExpr() {
   getNextToken();  // eat the for.
 
@@ -1134,7 +1134,7 @@
     return Error("expected identifier after for");
   
   std::string IdName = IdentifierStr;
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '=')
     return Error("expected '=' after for");
diff --git a/docs/tutorial/LangImpl7.html b/docs/tutorial/LangImpl7.html
index b002f7a..07dd5c6 100644
--- a/docs/tutorial/LangImpl7.html
+++ b/docs/tutorial/LangImpl7.html
@@ -809,8 +809,8 @@
 
 <div class="doc_code">
 <pre>
-/// varexpr ::= 'var' identifer ('=' expression)? 
-//                    (',' identifer ('=' expression)?)* 'in' expression
+/// varexpr ::= 'var' identifier ('=' expression)? 
+//                    (',' identifier ('=' expression)?)* 'in' expression
 static ExprAST *ParseVarExpr() {
   getNextToken();  // eat the var.
 
@@ -829,7 +829,7 @@
 <pre>
   while (1) {
     std::string Name = IdentifierStr;
-    getNextToken();  // eat identifer.
+    getNextToken();  // eat identifier.
 
     // Read the optional initializer.
     ExprAST *Init = 0;
@@ -1244,12 +1244,12 @@
 static ExprAST *ParseExpression();
 
 /// identifierexpr
-///   ::= identifer
-///   ::= identifer '(' expression* ')'
+///   ::= identifier
+///   ::= identifier '(' expression* ')'
 static ExprAST *ParseIdentifierExpr() {
   std::string IdName = IdentifierStr;
   
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '(') // Simple variable ref.
     return new VariableExprAST(IdName);
@@ -1322,7 +1322,7 @@
   return new IfExprAST(Cond, Then, Else);
 }
 
-/// forexpr ::= 'for' identifer '=' expr ',' expr (',' expr)? 'in' expression
+/// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
 static ExprAST *ParseForExpr() {
   getNextToken();  // eat the for.
 
@@ -1330,7 +1330,7 @@
     return Error("expected identifier after for");
   
   std::string IdName = IdentifierStr;
-  getNextToken();  // eat identifer.
+  getNextToken();  // eat identifier.
   
   if (CurTok != '=')
     return Error("expected '=' after for");
@@ -1364,8 +1364,8 @@
   return new ForExprAST(IdName, Start, End, Step, Body);
 }
 
-/// varexpr ::= 'var' identifer ('=' expression)? 
-//                    (',' identifer ('=' expression)?)* 'in' expression
+/// varexpr ::= 'var' identifier ('=' expression)? 
+//                    (',' identifier ('=' expression)?)* 'in' expression
 static ExprAST *ParseVarExpr() {
   getNextToken();  // eat the var.
 
@@ -1377,7 +1377,7 @@
   
   while (1) {
     std::string Name = IdentifierStr;
-    getNextToken();  // eat identifer.
+    getNextToken();  // eat identifier.
 
     // Read the optional initializer.
     ExprAST *Init = 0;
