mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
d: support api.parser.extends and api.parser.implements
The D skeleton was not properly supporting them. * data/skeletons/d.m4: Fix it. * tests/d.at: Check it. * tests/local.mk, tests/testsuite.at: Adjust.
This commit is contained in:
committed by
Akim Demaille
parent
8dc60543c8
commit
de638df104
@@ -58,6 +58,23 @@ m4_define([b4_percent_define_get3],
|
|||||||
[m4_ifval(m4_quote(b4_percent_define_get([$1])),
|
[m4_ifval(m4_quote(b4_percent_define_get([$1])),
|
||||||
[$2[]b4_percent_define_get([$1])[]$3], [$4])])
|
[$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)
|
# 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.abstract], [abstract ])dnl
|
||||||
b4_percent_define_flag_if([api.parser.final], [final ])dnl
|
b4_percent_define_flag_if([api.parser.final], [final ])dnl
|
||||||
[class ]b4_parser_class[]dnl
|
[class ]b4_parser_class[]dnl
|
||||||
b4_percent_define_get3([api.parser.extends], [ extends ])dnl
|
b4_percent_define_if_get2([api.parser.extends], [api.parser.implements], [ : ])dnl
|
||||||
b4_percent_define_get3([api.parser.implements], [ implements ])])
|
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)
|
# b4_lexer_if(TRUE, FALSE)
|
||||||
|
|||||||
82
tests/d.at
Normal file
82
tests/d.at
Normal file
@@ -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_KEYWORDS([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
|
||||||
@@ -57,6 +57,7 @@ TESTSUITE_AT = \
|
|||||||
%D%/conflicts.at \
|
%D%/conflicts.at \
|
||||||
%D%/counterexample.at \
|
%D%/counterexample.at \
|
||||||
%D%/cxx-type.at \
|
%D%/cxx-type.at \
|
||||||
|
%D%/d.at \
|
||||||
%D%/diagnostics.at \
|
%D%/diagnostics.at \
|
||||||
%D%/existing.at \
|
%D%/existing.at \
|
||||||
%D%/glr-regression.at \
|
%D%/glr-regression.at \
|
||||||
|
|||||||
@@ -87,6 +87,9 @@ m4_include([c++.at])
|
|||||||
m4_include([java.at])
|
m4_include([java.at])
|
||||||
m4_include([javapush.at])
|
m4_include([javapush.at])
|
||||||
|
|
||||||
|
# Parsers in D
|
||||||
|
m4_include([d.at])
|
||||||
|
|
||||||
# GLR.
|
# GLR.
|
||||||
# C++ types, simplified
|
# C++ types, simplified
|
||||||
m4_include([cxx-type.at])
|
m4_include([cxx-type.at])
|
||||||
|
|||||||
Reference in New Issue
Block a user