From 5302f28e95e32f1458e6e18844f963ccaa2120fe Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sat, 30 Apr 2016 00:11:42 +0200 Subject: Add Java comments check --- src/regex/RegexTest.java | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/regex/RegexTest.java b/src/regex/RegexTest.java index fff0796..8345965 100644 --- a/src/regex/RegexTest.java +++ b/src/regex/RegexTest.java @@ -180,6 +180,69 @@ public class RegexTest { reMatlabComment.assertFail("%{\n%}x"); reMatlabComment.assertFail("%{ \nx %}"); reMatlabComment.assertFail("%{\n%}%}"); + System.out.println(); + } + + static void checkJavaComment() { + /* CR ::= #0a + * LF ::= #0d + * InputCharacter ::= Char - CR - LF + * LineTerminator ::= LF | CR | CR LF + * NotStar ::= InputCharacter - "*" | LineTerminator + * NotStarSlash ::= InputCharacter - "*" - "/" | LineTerminator + * + * TraditionalComment ::= "/" "*" CommentTail + * CommentTail ::= "*" CommentTailStar | NotStar CommentTail + * CommentTailStar ::= "/" | "*" CommentTailStar + * CommentTailStar ::= NotStarSlash CommentTail + * EndOfLineComment ::= "/" "/" InputCharacter* + * Comment ::= TraditionalComment | EndOfLineComment + * + * Note: while the Java Language Specification dictates that + * UnicodeEscape tokens are recognized, here it is assumed that this + * step is already handled. If not, then all "/", "*", newlines and Char + * tokens should be either its respective literal or the UnicodeEscape + * that represents this literal. + * + * https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.7 + */ + String sl = "//[^\n\r]*"; + // Match parts starting with a star, followed by CommentTailStar, but + // only where CommentTailStar = "*" CommentTailStar, terminated by + // NotStarSlash [CommentTail]. There is a special case in the "ml" + // regex for when CommentTailStar does not contain NotStarSlash. + String star = "\\*+[^/*]"; + String nostar = "[^\\*]"; + String ml = "/\\*" + "(" + star + "|" + nostar + ")*\\**" + "\\*/"; + RegexTest reJavaComment = new RegexTest(sl + "|" + ml); + + // Single-line comment + reJavaComment.assertOk("//"); + reJavaComment.assertOk("// ok"); + reJavaComment.assertOk("/// ok//"); + reJavaComment.assertFail("//\n"); + reJavaComment.assertFail("//\n//"); + + // Multi-line comments + reJavaComment.assertOk("/**/"); + reJavaComment.assertOk("/***/"); + reJavaComment.assertOk("/* xxx */"); + reJavaComment.assertOk("/*\n*/"); + reJavaComment.assertOk("/*\r\n*/"); + reJavaComment.assertOk("/*/*/"); + reJavaComment.assertOk("/*//*/"); + reJavaComment.assertOk("/*///*/"); + reJavaComment.assertOk("/** */"); + reJavaComment.assertOk("/** /*/"); + reJavaComment.assertOk("/*xxx\n*/"); + reJavaComment.assertOk("/*\nxxx*/"); + reJavaComment.assertOk("/*\nxxx\n*/"); + reJavaComment.assertOk("/*\nxx\nx\n*/"); + reJavaComment.assertFail("/**/ x"); + reJavaComment.assertFail("/**///"); + reJavaComment.assertFail("/**//*/"); + reJavaComment.assertFail("/**//**/"); + System.out.println(); } public static void main(String[] args) { @@ -188,6 +251,7 @@ public class RegexTest { checkFLOAT(); checkString(); checkMatlabComment(); + checkJavaComment(); System.out.println("Passed."); } } -- cgit v1.2.1