[mlir][Tutorial] Make parsing an empty file print a better error.
authorMatthias Kramm <kramm@google.com>
Tue, 3 Mar 2020 21:20:48 +0000 (13:20 -0800)
committerRiver Riddle <riddleriver@gmail.com>
Tue, 3 Mar 2020 21:21:05 +0000 (13:21 -0800)
Summary:
Previously, we would, for an empty file, print the somewhat confusing
  Assertion `tok == curTok [...]' failed.
With this change, we now print
  Parse error [...]: expected 'def' [...]

This only affects the parser from chapters 1-6, since the more advanced
chapter 7 parser is actually able to generate an empty module from an
empty file.  Nonetheless, this commit also adds the additional check to
the chapter 7 parser, for consistency.

Differential Revision: https://reviews.llvm.org/D75534

14 files changed:
mlir/examples/toy/Ch1/include/toy/Parser.h
mlir/examples/toy/Ch2/include/toy/Parser.h
mlir/examples/toy/Ch3/include/toy/Parser.h
mlir/examples/toy/Ch4/include/toy/Parser.h
mlir/examples/toy/Ch5/include/toy/Parser.h
mlir/examples/toy/Ch6/include/toy/Parser.h
mlir/examples/toy/Ch7/include/toy/Parser.h
mlir/test/Examples/Toy/Ch1/empty.toy [new file with mode: 0644]
mlir/test/Examples/Toy/Ch2/empty.toy [new file with mode: 0644]
mlir/test/Examples/Toy/Ch3/empty.toy [new file with mode: 0644]
mlir/test/Examples/Toy/Ch4/empty.toy [new file with mode: 0644]
mlir/test/Examples/Toy/Ch5/empty.toy [new file with mode: 0644]
mlir/test/Examples/Toy/Ch6/empty.toy [new file with mode: 0644]
mlir/test/Examples/Toy/Ch7/empty.toy [new file with mode: 0644]

index e1634fc..5a7b212 100644 (file)
@@ -396,7 +396,11 @@ private:
   /// decl_list ::= identifier | identifier, decl_list
   std::unique_ptr<PrototypeAST> parsePrototype() {
     auto loc = lexer.getLastLocation();
+
+    if (lexer.getCurToken() != tok_def)
+      return parseError<PrototypeAST>("def", "in prototype");
     lexer.consume(tok_def);
+
     if (lexer.getCurToken() != tok_identifier)
       return parseError<PrototypeAST>("function name", "in prototype");
 
index e1634fc..5a7b212 100644 (file)
@@ -396,7 +396,11 @@ private:
   /// decl_list ::= identifier | identifier, decl_list
   std::unique_ptr<PrototypeAST> parsePrototype() {
     auto loc = lexer.getLastLocation();
+
+    if (lexer.getCurToken() != tok_def)
+      return parseError<PrototypeAST>("def", "in prototype");
     lexer.consume(tok_def);
+
     if (lexer.getCurToken() != tok_identifier)
       return parseError<PrototypeAST>("function name", "in prototype");
 
index e1634fc..5a7b212 100644 (file)
@@ -396,7 +396,11 @@ private:
   /// decl_list ::= identifier | identifier, decl_list
   std::unique_ptr<PrototypeAST> parsePrototype() {
     auto loc = lexer.getLastLocation();
+
+    if (lexer.getCurToken() != tok_def)
+      return parseError<PrototypeAST>("def", "in prototype");
     lexer.consume(tok_def);
+
     if (lexer.getCurToken() != tok_identifier)
       return parseError<PrototypeAST>("function name", "in prototype");
 
index e1634fc..5a7b212 100644 (file)
@@ -396,7 +396,11 @@ private:
   /// decl_list ::= identifier | identifier, decl_list
   std::unique_ptr<PrototypeAST> parsePrototype() {
     auto loc = lexer.getLastLocation();
+
+    if (lexer.getCurToken() != tok_def)
+      return parseError<PrototypeAST>("def", "in prototype");
     lexer.consume(tok_def);
+
     if (lexer.getCurToken() != tok_identifier)
       return parseError<PrototypeAST>("function name", "in prototype");
 
index e1634fc..5a7b212 100644 (file)
@@ -396,7 +396,11 @@ private:
   /// decl_list ::= identifier | identifier, decl_list
   std::unique_ptr<PrototypeAST> parsePrototype() {
     auto loc = lexer.getLastLocation();
+
+    if (lexer.getCurToken() != tok_def)
+      return parseError<PrototypeAST>("def", "in prototype");
     lexer.consume(tok_def);
+
     if (lexer.getCurToken() != tok_identifier)
       return parseError<PrototypeAST>("function name", "in prototype");
 
index e1634fc..5a7b212 100644 (file)
@@ -396,7 +396,11 @@ private:
   /// decl_list ::= identifier | identifier, decl_list
   std::unique_ptr<PrototypeAST> parsePrototype() {
     auto loc = lexer.getLastLocation();
+
+    if (lexer.getCurToken() != tok_def)
+      return parseError<PrototypeAST>("def", "in prototype");
     lexer.consume(tok_def);
+
     if (lexer.getCurToken() != tok_identifier)
       return parseError<PrototypeAST>("function name", "in prototype");
 
index 3d91281..cb6598c 100644 (file)
@@ -534,7 +534,11 @@ private:
   /// decl_list ::= identifier | identifier, decl_list
   std::unique_ptr<PrototypeAST> parsePrototype() {
     auto loc = lexer.getLastLocation();
+
+    if (lexer.getCurToken() != tok_def)
+      return parseError<PrototypeAST>("def", "in prototype");
     lexer.consume(tok_def);
+
     if (lexer.getCurToken() != tok_identifier)
       return parseError<PrototypeAST>("function name", "in prototype");
 
diff --git a/mlir/test/Examples/Toy/Ch1/empty.toy b/mlir/test/Examples/Toy/Ch1/empty.toy
new file mode 100644 (file)
index 0000000..1e1e83a
--- /dev/null
@@ -0,0 +1,3 @@
+# RUN: toyc-ch1 %s -emit=ast 2>&1 | FileCheck %s
+# CHECK-NOT: Assert
+# CHECK: Parse error
diff --git a/mlir/test/Examples/Toy/Ch2/empty.toy b/mlir/test/Examples/Toy/Ch2/empty.toy
new file mode 100644 (file)
index 0000000..36d092e
--- /dev/null
@@ -0,0 +1,3 @@
+# RUN: toyc-ch2 %s -emit=ast 2>&1 | FileCheck %s
+# CHECK-NOT: Assert
+# CHECK: Parse error
diff --git a/mlir/test/Examples/Toy/Ch3/empty.toy b/mlir/test/Examples/Toy/Ch3/empty.toy
new file mode 100644 (file)
index 0000000..87baab2
--- /dev/null
@@ -0,0 +1,3 @@
+# RUN: toyc-ch3 %s -emit=ast 2>&1 | FileCheck %s
+# CHECK-NOT: Assert
+# CHECK: Parse error
diff --git a/mlir/test/Examples/Toy/Ch4/empty.toy b/mlir/test/Examples/Toy/Ch4/empty.toy
new file mode 100644 (file)
index 0000000..5ad37f7
--- /dev/null
@@ -0,0 +1,3 @@
+# RUN: toyc-ch4 %s -emit=ast 2>&1 | FileCheck %s
+# CHECK-NOT: Assert
+# CHECK: Parse error
diff --git a/mlir/test/Examples/Toy/Ch5/empty.toy b/mlir/test/Examples/Toy/Ch5/empty.toy
new file mode 100644 (file)
index 0000000..d43f34e
--- /dev/null
@@ -0,0 +1,3 @@
+# RUN: toyc-ch5 %s -emit=ast 2>&1 | FileCheck %s
+# CHECK-NOT: Assert
+# CHECK: Parse error
diff --git a/mlir/test/Examples/Toy/Ch6/empty.toy b/mlir/test/Examples/Toy/Ch6/empty.toy
new file mode 100644 (file)
index 0000000..f221f38
--- /dev/null
@@ -0,0 +1,3 @@
+# RUN: toyc-ch6 %s -emit=ast 2>&1 | FileCheck %s
+# CHECK-NOT: Assert
+# CHECK: Parse error
diff --git a/mlir/test/Examples/Toy/Ch7/empty.toy b/mlir/test/Examples/Toy/Ch7/empty.toy
new file mode 100644 (file)
index 0000000..d9d4b8e
--- /dev/null
@@ -0,0 +1,4 @@
+# RUN: toyc-ch7 %s -emit=ast 2>&1 | FileCheck %s
+# CHECK-NOT: Assert
+# CHECK-NOT: Parse error
+# CHECK: Module