浏览代码

more precise diagnostic for IF/THEN syntax errors

Vladislav Folts 11 年之前
父节点
当前提交
65f7e581cd
共有 2 个文件被更改,包括 5 次插入3 次删除
  1. 2 2
      src/grammar.js
  2. 3 1
      test/test_unit.js

+ 2 - 2
src/grammar.js

@@ -103,8 +103,8 @@ var statement = optional(or(
                  ));
                  ));
 var statementSequence = and(statement, repeat(and(";", statement)));
 var statementSequence = and(statement, repeat(and(";", statement)));
 
 
-var ifStatement = and("IF", context(expression, Context.If), "THEN", statementSequence
-                    , repeat(and("ELSIF", context(expression, Context.ElseIf), "THEN", statementSequence))
+var ifStatement = and("IF", context(expression, Context.If), required("THEN", "THEN expected"), statementSequence
+                    , repeat(and("ELSIF", context(expression, Context.ElseIf), required("THEN", "THEN expected"), statementSequence))
                     , optional(and("ELSE", context(statementSequence, Context.Else)))
                     , optional(and("ELSE", context(statementSequence, Context.Else)))
                     , emit("END", Context.emitIfEnd));
                     , emit("END", Context.emitIfEnd));
 
 

+ 3 - 1
test/test_unit.js

@@ -767,7 +767,9 @@ var testSuite = {
          ["IF b1 THEN i1 := 0 ELSIF i1 THEN i1 := 2 END",
          ["IF b1 THEN i1 := 0 ELSIF i1 THEN i1 := 2 END",
           "'BOOLEAN' expression expected, got 'INTEGER'"],
           "'BOOLEAN' expression expected, got 'INTEGER'"],
          ["IF p THEN i1 := 0 END",
          ["IF p THEN i1 := 0 END",
-          "'BOOLEAN' expression expected, got 'POINTER TO anonymous RECORD'"])
+          "'BOOLEAN' expression expected, got 'POINTER TO anonymous RECORD'"],
+         ["IF b1 (*THEN*) i1 := 0 END", "THEN expected"],
+         ["IF b1 THEN i1 := 0 ELSIF ~b1 (*THEN*) i1 := 0 END", "THEN expected"])
     ),
     ),
 "CASE statement": testWithContext(
 "CASE statement": testWithContext(
     context(Grammar.statement,
     context(Grammar.statement,