[DTrace-devel] [PATCH v2] lexer: support // comments

Kris Van Hees kris.van.hees at oracle.com
Wed Jul 23 05:11:06 UTC 2025


Suggested-by: Ruud van der Pas <ruud.vanderpas at oracle.com>
Suggested-by: Alan Maguire <alan.maguire at oracle.com>
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_lex.l                            | 11 ++++++++++-
 test/unittest/lexer/tst.boc-in-line-comment.d | 16 ++++++++++++++++
 test/unittest/lexer/tst.boc-in-line-comment.r |  5 +++++
 test/unittest/lexer/tst.eoc-in-line-comment.d | 16 ++++++++++++++++
 test/unittest/lexer/tst.eoc-in-line-comment.r |  5 +++++
 test/unittest/lexer/tst.eof-in-line-comment.d | 16 ++++++++++++++++
 test/unittest/lexer/tst.eof-in-line-comment.r |  5 +++++
 test/unittest/lexer/tst.lc-in-line-comment.d  | 16 ++++++++++++++++
 test/unittest/lexer/tst.lc-in-line-comment.r  |  5 +++++
 test/unittest/lexer/tst.line-comment.d        | 16 ++++++++++++++++
 test/unittest/lexer/tst.line-comment.r        |  5 +++++
 11 files changed, 115 insertions(+), 1 deletion(-)
 create mode 100644 test/unittest/lexer/tst.boc-in-line-comment.d
 create mode 100644 test/unittest/lexer/tst.boc-in-line-comment.r
 create mode 100644 test/unittest/lexer/tst.eoc-in-line-comment.d
 create mode 100644 test/unittest/lexer/tst.eoc-in-line-comment.r
 create mode 100644 test/unittest/lexer/tst.eof-in-line-comment.d
 create mode 100644 test/unittest/lexer/tst.eof-in-line-comment.r
 create mode 100644 test/unittest/lexer/tst.lc-in-line-comment.d
 create mode 100644 test/unittest/lexer/tst.lc-in-line-comment.r
 create mode 100644 test/unittest/lexer/tst.line-comment.d
 create mode 100644 test/unittest/lexer/tst.line-comment.r

diff --git a/libdtrace/dt_lex.l b/libdtrace/dt_lex.l
index 9d502912..e8f3bc8c 100644
--- a/libdtrace/dt_lex.l
+++ b/libdtrace/dt_lex.l
@@ -35,6 +35,7 @@ int yydebug;
  * S2 - D program outer scope (probe specifiers and declarations)
  * S3 - D control line parsing (i.e. after ^# is seen but before \n)
  * S4 - D control line scan (locate control directives only and invoke S3)
+ * S5 - D line comments (i.e. skip everything until end of line)
  * SIDENT - identifiers and comments only (after -> and .).  (We switch to
  *          SIDENT only from state S0: changing this would require new code
  *          to track the state to switch back to.)
@@ -46,7 +47,7 @@ int yydebug;
 %n 600		/* maximum states */
 %option yylineno
 
-%s S0 S1 S2 S3 S4 SIDENT
+%s S0 S1 S2 S3 S4 S5 SIDENT
 
 RGX_AGG		"@"[a-zA-Z_][0-9a-zA-Z_]*
 RGX_PSPEC	[-$:a-zA-Z_.?*\\\[\]!][-$:0-9a-zA-Z_.`?*\\\[\]!]*
@@ -408,6 +409,11 @@ if (yypcb->pcb_token != 0) {
 			BEGIN(S1);
 		}
 
+<S0,S2,SIDENT>"//"	{
+			yypcb->pcb_cstate = (YYSTATE);
+			BEGIN(S5);
+		}
+
 <S0>^{RGX_INTERP} |
 <S2>^{RGX_INTERP} ;	/* discard any #! lines */
 
@@ -548,6 +554,9 @@ if (yypcb->pcb_token != 0) {
 <S1>.|\n	; /* discard */
 <S1><<EOF>>	yyerror("end-of-file encountered before matching */\n");
 
+<S5>\n		BEGIN(yypcb->pcb_cstate);
+<S5>.		; /* discard */
+
 <S2>{RGX_PSPEC}	{
 			/*
 			 * S2 has an ambiguity because RGX_PSPEC includes '*'
diff --git a/test/unittest/lexer/tst.boc-in-line-comment.d b/test/unittest/lexer/tst.boc-in-line-comment.d
new file mode 100644
index 00000000..61f5961f
--- /dev/null
+++ b/test/unittest/lexer/tst.boc-in-line-comment.d
@@ -0,0 +1,16 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Line comments cannot contain begin-of-comment markers.
+ */
+
+// Comment /*
+BEGIN
+{
+	exit(0);
+}
diff --git a/test/unittest/lexer/tst.boc-in-line-comment.r b/test/unittest/lexer/tst.boc-in-line-comment.r
new file mode 100644
index 00000000..d57f017a
--- /dev/null
+++ b/test/unittest/lexer/tst.boc-in-line-comment.r
@@ -0,0 +1,5 @@
+                   FUNCTION:NAME
+                          :BEGIN 
+
+-- @@stderr --
+dtrace: script 'test/unittest/lexer/tst.boc-in-line-comment.d' matched 1 probe
diff --git a/test/unittest/lexer/tst.eoc-in-line-comment.d b/test/unittest/lexer/tst.eoc-in-line-comment.d
new file mode 100644
index 00000000..8fe2ff04
--- /dev/null
+++ b/test/unittest/lexer/tst.eoc-in-line-comment.d
@@ -0,0 +1,16 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Line comments cannot contain end-of-comment markers.
+ */
+
+// Comment */
+BEGIN
+{
+	exit(0);
+}
diff --git a/test/unittest/lexer/tst.eoc-in-line-comment.r b/test/unittest/lexer/tst.eoc-in-line-comment.r
new file mode 100644
index 00000000..884cd554
--- /dev/null
+++ b/test/unittest/lexer/tst.eoc-in-line-comment.r
@@ -0,0 +1,5 @@
+                   FUNCTION:NAME
+                          :BEGIN 
+
+-- @@stderr --
+dtrace: script 'test/unittest/lexer/tst.eoc-in-line-comment.d' matched 1 probe
diff --git a/test/unittest/lexer/tst.eof-in-line-comment.d b/test/unittest/lexer/tst.eof-in-line-comment.d
new file mode 100644
index 00000000..a9207693
--- /dev/null
+++ b/test/unittest/lexer/tst.eof-in-line-comment.d
@@ -0,0 +1,16 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: End-of-file in a line comment is an error.
+ */
+
+BEGIN
+{
+	exit(0);
+}
+// Comment
\ No newline at end of file
diff --git a/test/unittest/lexer/tst.eof-in-line-comment.r b/test/unittest/lexer/tst.eof-in-line-comment.r
new file mode 100644
index 00000000..fdf259e0
--- /dev/null
+++ b/test/unittest/lexer/tst.eof-in-line-comment.r
@@ -0,0 +1,5 @@
+                   FUNCTION:NAME
+                          :BEGIN 
+
+-- @@stderr --
+dtrace: script 'test/unittest/lexer/tst.eof-in-line-comment.d' matched 1 probe
diff --git a/test/unittest/lexer/tst.lc-in-line-comment.d b/test/unittest/lexer/tst.lc-in-line-comment.d
new file mode 100644
index 00000000..0332e1ae
--- /dev/null
+++ b/test/unittest/lexer/tst.lc-in-line-comment.d
@@ -0,0 +1,16 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: Line comments cannot contain a line commens marker.
+ */
+
+// Comment //
+BEGIN
+{
+	exit(0);
+}
diff --git a/test/unittest/lexer/tst.lc-in-line-comment.r b/test/unittest/lexer/tst.lc-in-line-comment.r
new file mode 100644
index 00000000..3075b987
--- /dev/null
+++ b/test/unittest/lexer/tst.lc-in-line-comment.r
@@ -0,0 +1,5 @@
+                   FUNCTION:NAME
+                          :BEGIN 
+
+-- @@stderr --
+dtrace: script 'test/unittest/lexer/tst.lc-in-line-comment.d' matched 1 probe
diff --git a/test/unittest/lexer/tst.line-comment.d b/test/unittest/lexer/tst.line-comment.d
new file mode 100644
index 00000000..4deb66f4
--- /dev/null
+++ b/test/unittest/lexer/tst.line-comment.d
@@ -0,0 +1,16 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: // comments are supported.
+ */
+
+// exit(1);
+BEGIN // exit(1);
+{ // exit(1);
+	exit(0); // exit(1);
+} // exit(1);
diff --git a/test/unittest/lexer/tst.line-comment.r b/test/unittest/lexer/tst.line-comment.r
new file mode 100644
index 00000000..d4e4c325
--- /dev/null
+++ b/test/unittest/lexer/tst.line-comment.r
@@ -0,0 +1,5 @@
+                   FUNCTION:NAME
+                          :BEGIN 
+
+-- @@stderr --
+dtrace: script 'test/unittest/lexer/tst.line-comment.d' matched 1 probe
-- 
2.45.2




More information about the DTrace-devel mailing list