Re: [PATCH for Dlang support] tests: d: check the extends and implements directives for the parser class

Akim Demaille <[email protected]>
Newsgroups gmane.comp.parsers.bison.patches
Message-ID <[email protected]>
Hi Adela,

> Le 23 sept. 2020 à 20:51, Adela Vais <[email protected]> a écrit :
> 
> The D skeleton was not properly supporting these directives.
> 
> * data/skeletons/d.m4: Fix it.
> * tests/d.at: (New.) Check it.
> * tests/local.mk, tests/testsuite.at: Adjust.

Thanks!  Installed as follows.  I didn't know D featured interfaces, that's nice.  I don't see when someone would install the parser below an interface though.

Have you had a look at LAC?  That's something which would be most useful in the skeleton.  I have not forgotten your patch for yylex, I'll work on it asap.

Cheers!

commit 02b0b387ba391d3329b91b8ad305610dec30a025
Author: Adela Vais <[email protected]>
Date:   Wed Sep 23 21:51:21 2020 +0300

    d: check the extends and implements directives for the parser class
    
    The D skeleton was not properly supporting api.parser.extends and
    api.parser.implements.
    
    * data/skeletons/d.m4: Fix it.
    * tests/d.at: Check it.
    * tests/local.mk, tests/testsuite.at: Adjust.

diff --git a/data/skeletons/d.m4 b/data/skeletons/d.m4
index abaa4c7b..9e4c4995 100644
--- a/data/skeletons/d.m4
+++ b/data/skeletons/d.m4
@@ -58,6 +58,23 @@ m4_define([b4_percent_define_get3],
           [m4_ifval(m4_quote(b4_percent_define_get([$1])),
                 [$2[]b4_percent_define_get([$1])[]$3], [$4])])
 
+# b4_percent_define_if_get2(ARG1, ARG2, DEF, NOT)
+# -----------------------------------------------
+# Expand to the value of DEF if ARG1 or ARG2 are %define'ed,
+# otherwise NOT.
+m4_define([b4_percent_define_if_get2],
+          [m4_ifval(m4_quote(b4_percent_define_get([$1])),
+                [$3], [m4_ifval(m4_quote(b4_percent_define_get([$2])),
+                      [$3], [$4])])])
+
+# b4_percent_define_class_before_interface(CLASS, INTERFACE)
+# ----------------------------------------------------------
+# Expand to a ', ' if both a class and an interface have been %define'ed
+m4_define([b4_percent_define_class_before_interface],
+          [m4_ifval(m4_quote(b4_percent_define_get([$1])),
+                [m4_ifval(m4_quote(b4_percent_define_get([$2])),
+                      [, ])])])
+
 
 # b4_flag_value(BOOLEAN-FLAG)
 # ---------------------------
@@ -78,8 +95,10 @@ b4_percent_define_flag_if([api.parser.public],   [public ])dnl
 b4_percent_define_flag_if([api.parser.abstract], [abstract ])dnl
 b4_percent_define_flag_if([api.parser.final],    [final ])dnl
 [class ]b4_parser_class[]dnl
-b4_percent_define_get3([api.parser.extends], [ extends ])dnl
-b4_percent_define_get3([api.parser.implements], [ implements ])])
+b4_percent_define_if_get2([api.parser.extends], [api.parser.implements], [ : ])dnl
+b4_percent_define_get([api.parser.extends])dnl
+b4_percent_define_class_before_interface([api.parser.extends], [api.parser.implements])dnl
+b4_percent_define_get([api.parser.implements])])
 
 
 # b4_lexer_if(TRUE, FALSE)
diff --git a/tests/d.at b/tests/d.at
new file mode 100644
index 00000000..fccdfaec
--- /dev/null
+++ b/tests/d.at
@@ -0,0 +1,82 @@
+# D features tests.                      -*- Autotest -*-
+
+# Copyright (C) 2020 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+AT_BANNER([[D Features.]])
+
+# AT_CHECK_D_MINIMAL([DIRECTIVES], [PARSER_ACTION], [POSITION_CLASS], [EXTRA_USER_CODE])
+# ----------------------------------------------------------------------
+# Check that a minimal parser with DIRECTIVES compiles in D.
+# Put the D code in YYParser.d.
+m4_define([AT_CHECK_D_MINIMAL],
+[
+AT_DATA([[YYParser.y]], [
+%language "D"
+%token END "end"
+[$1]
+%%
+start: END {$2};
+%%
+[$4]
+void main() {}
+])
+AT_BISON_CHECK([[-Wno-deprecated YYParser.y]])
+AT_CHECK([[grep '[mb]4_' YYParser.y]], [1], [ignore])
+AT_COMPILE_D([[YYParser]])
+])
+
+# AT_CHECK_D_GREP([LINE], [COUNT=1])
+# -------------------------------------
+# Check that YYParser.d contains exactly COUNT lines matching ^LINE$
+# with grep.
+m4_define([AT_CHECK_D_GREP],
+[AT_CHECK([grep -c '^$1$' YYParser.d], [ignore], [m4_default([$2], [1])
+])])
+
+## -------------------------------------- ##
+## D parser class extends and implements. ##
+## -------------------------------------- ##
+
+AT_SETUP([D parser class extends and implements])
+AT_KEYWORD([d])
+
+AT_CHECK_D_MINIMAL([])
+AT_CHECK_D_GREP([[class YYParser]])
+
+AT_CHECK_D_MINIMAL([%define api.parser.extends {BaseClass}], [], [], [class BaseClass {}])
+AT_CHECK_D_GREP([[class YYParser : BaseClass]])
+
+AT_CHECK_D_MINIMAL([%define api.parser.extends {Interface}], [], [], [interface Interface {}])
+AT_CHECK_D_GREP([[class YYParser : Interface]])
+
+AT_CHECK_D_MINIMAL(
+[%define api.parser.extends {BaseClass}
+%define api.parser.implements {Interface}], [], [],
+[class BaseClass {}
+interface Interface {}
+])
+AT_CHECK_D_GREP([[class YYParser : BaseClass, Interface]])
+
+AT_CHECK_D_MINIMAL(
+[%define api.parser.extends {BaseClass}
+%define api.parser.implements {Interface1, Interface2}], [], [],
+[class BaseClass {}
+interface Interface1 {}
+interface Interface2 {}
+])
+AT_CHECK_D_GREP([[class YYParser : BaseClass, Interface1, Interface2]])
+
+AT_CLEANUP
diff --git a/tests/local.mk b/tests/local.mk
index 71e1f7a3..72328832 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -57,6 +57,7 @@ TESTSUITE_AT =                                \
   %D%/conflicts.at                            \
   %D%/counterexample.at                       \
   %D%/cxx-type.at                             \
+  %D%/d.at                                    \
   %D%/diagnostics.at                          \
   %D%/existing.at                             \
   %D%/glr-regression.at                       \
diff --git a/tests/testsuite.at b/tests/testsuite.at
index b09872dc..5741b811 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -87,6 +87,9 @@ m4_include([c++.at])
 m4_include([java.at])
 m4_include([javapush.at])
 
+# Parsers in D
+m4_include([d.at])
+
 # GLR.
 # C++ types, simplified
 m4_include([cxx-type.at])
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.