mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-12 13:53:03 +00:00
Improve C++ namespace support. Discussed starting at
<http://lists.gnu.org/archive/html/help-bison/2007-09/msg00016.html>. * data/c++.m4: (b4_namespace_ref, b4_namespace_open, b4_namespace_close): New macros that interpret the %define variable "namespace" so its value can contain "::" to indicate nested namespaces. * data/glr.cc (b4_namespace): Don't define, and replace all uses with the above macros. * data/lalr1.cc (b4_namespace): Likewise. * data/location.cc (b4_namespace): Likewise. * doc/bison.texinfo (Decl Summary): Move `%define push_pull' entry inside a new table in the general %define entry. Document `%define namespace' there as well. Point the %name-prefix entry to it since it explains it more completely in the case of C++. (C++ Bison Interface): Mention `%define namespace' instead of %name-prefix. (Table of Symbols): Remove the `%define push_pull' entry. The %define entry suffices. * tests/c++.at (Relative namespace references): New test case. (Absolute namespace references): New test case. (Syntactically invalid namespace references): New test case. * tests/input.at (C++ namespace reference errors): New test case.
This commit is contained in:
83
tests/c++.at
83
tests/c++.at
@@ -1,5 +1,5 @@
|
||||
# Checking the output filenames. -*- Autotest -*-
|
||||
# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2004, 2005, 2007 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
|
||||
@@ -99,3 +99,84 @@ m4_popdef([AT_DOXYGEN_PRIVATE])
|
||||
|
||||
AT_CHECK_DOXYGEN([Public])
|
||||
AT_CHECK_DOXYGEN([Private])
|
||||
|
||||
## ------------ ##
|
||||
## Namespaces. ##
|
||||
## ------------ ##
|
||||
|
||||
# AT_CHECK_NAMESPACE(NAMESPACE-DECL, [COMPILE-ERROR])
|
||||
# ---------------------------------------------------
|
||||
# See if Bison can handle %define namespace "NAMESPACE-DECL". If COMPILE-ERROR
|
||||
# is specified, then Bison should accept the input, but compilation will fail,
|
||||
# so don't check compilation.
|
||||
m4_define([AT_CHECK_NAMESPACE],
|
||||
[
|
||||
|
||||
AT_DATA_GRAMMAR([[input.y]],
|
||||
[[%language "C++"
|
||||
%defines
|
||||
%define namespace "]$1["
|
||||
%union { int i; }
|
||||
%define global_tokens_and_yystype
|
||||
|
||||
%code {
|
||||
// YYSTYPE contains a namespace reference.
|
||||
int yylex (YYSTYPE *lval) {
|
||||
lval->i = 3;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
%%
|
||||
|
||||
start: ;
|
||||
|
||||
%%
|
||||
|
||||
void
|
||||
]$1[::parser::error (const ]$1[::parser::location_type &loc,
|
||||
const std::string &msg)
|
||||
{
|
||||
std::cerr << "At " << loc << ": " << msg << std::endl;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
]$1[::parser p;
|
||||
return p.parse ();
|
||||
}
|
||||
]])
|
||||
|
||||
AT_CHECK([[bison -o input.cc input.y]])
|
||||
|
||||
m4_if([$#], [1],
|
||||
[AT_COMPILE_CXX([[input]], [[input.cc]])
|
||||
AT_PARSER_CHECK([[./input]])])
|
||||
|
||||
])
|
||||
|
||||
AT_SETUP([[Relative namespace references]])
|
||||
AT_CHECK_NAMESPACE([[foo]])
|
||||
AT_CHECK_NAMESPACE([[foo::bar]])
|
||||
AT_CHECK_NAMESPACE([[foo::bar::baz]])
|
||||
AT_CLEANUP
|
||||
|
||||
AT_SETUP([[Absolute namespace references]])
|
||||
AT_CHECK_NAMESPACE([[::foo]])
|
||||
AT_CHECK_NAMESPACE([[::foo::bar]])
|
||||
AT_CHECK_NAMESPACE([[::foo::bar::baz]])
|
||||
AT_CHECK_NAMESPACE([[ ::foo]])
|
||||
AT_CHECK_NAMESPACE([[ ::foo::bar]])
|
||||
AT_CHECK_NAMESPACE([[ ::foo::bar::baz]])
|
||||
AT_CLEANUP
|
||||
|
||||
AT_SETUP([[Syntactically invalid namespace references]])
|
||||
AT_CHECK_NAMESPACE([[:foo:bar]], [[-]])
|
||||
AT_CHECK_NAMESPACE([[foo: :bar]], [[-]])
|
||||
# This one is interesting because `[3]' is encoded as `@<:@3@:>@', which
|
||||
# contains single occurrences of `:'.
|
||||
AT_CHECK_NAMESPACE([[foo[3]::bar::baz]], [[-]])
|
||||
AT_CHECK_NAMESPACE([[foo::bar,baz]], [[-]])
|
||||
AT_CHECK_NAMESPACE([[foo::bar::(baz]], [[-]])
|
||||
AT_CLEANUP
|
||||
|
||||
@@ -858,3 +858,52 @@ AT_CHECK([[bison input.y]], [1], [],
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
## -------------------------------- ##
|
||||
## C++ namespace reference errors. ##
|
||||
## -------------------------------- ##
|
||||
|
||||
AT_SETUP([[C++ namespace reference errors]])
|
||||
|
||||
# AT_CHECK_NAMESPACE_ERROR(NAMESPACE-DECL, ERROR, [ERROR], ...)
|
||||
# -------------------------------------------------------------
|
||||
# Make sure Bison reports all ERROR's for %define namespace "NAMESPACE-DECL".
|
||||
m4_define([AT_CHECK_NAMESPACE_ERROR],
|
||||
[
|
||||
AT_DATA([[input.y]],
|
||||
[[%language "C++"
|
||||
%defines
|
||||
%define namespace "]$1["
|
||||
%%
|
||||
start: ;
|
||||
]])
|
||||
|
||||
AT_CHECK([[bison input.y]], [1], [],
|
||||
[m4_foreach([b4_arg], m4_dquote(m4_shift($@)),
|
||||
[[input.y:3.9-17: ]b4_arg[
|
||||
]])])
|
||||
])
|
||||
|
||||
AT_CHECK_NAMESPACE_ERROR([[]],
|
||||
[[namespace reference is empty]])
|
||||
AT_CHECK_NAMESPACE_ERROR([[ ]],
|
||||
[[namespace reference is empty]])
|
||||
AT_CHECK_NAMESPACE_ERROR([[foo::::bar]],
|
||||
[[namespace reference has consecutive "::"]])
|
||||
AT_CHECK_NAMESPACE_ERROR([[foo:: ::bar]],
|
||||
[[namespace reference has consecutive "::"]])
|
||||
AT_CHECK_NAMESPACE_ERROR([[::::bar]],
|
||||
[[namespace reference has consecutive "::"]])
|
||||
AT_CHECK_NAMESPACE_ERROR([[:: ::bar]],
|
||||
[[namespace reference has consecutive "::"]])
|
||||
AT_CHECK_NAMESPACE_ERROR([[foo::bar:: ::]],
|
||||
[[namespace reference has consecutive "::"]],
|
||||
[[namespace reference has a trailing "::"]])
|
||||
AT_CHECK_NAMESPACE_ERROR([[foo::bar::]],
|
||||
[[namespace reference has a trailing "::"]])
|
||||
AT_CHECK_NAMESPACE_ERROR([[foo::bar:: ]],
|
||||
[[namespace reference has a trailing "::"]])
|
||||
AT_CHECK_NAMESPACE_ERROR([[::]],
|
||||
[[namespace reference has a trailing "::"]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
Reference in New Issue
Block a user