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])
