sammccall updated this revision to Diff 415619. sammccall marked 4 inline comments as done. sammccall added a comment.
Rebase and restore conventional test/Unit suite Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D121233/new/ https://reviews.llvm.org/D121233 Files: clang-tools-extra/CMakeLists.txt clang-tools-extra/pseudo/CMakeLists.txt clang-tools-extra/pseudo/README.md clang-tools-extra/pseudo/include/clang-pseudo/DirectiveMap.h clang-tools-extra/pseudo/include/clang-pseudo/Grammar.h clang-tools-extra/pseudo/include/clang-pseudo/LRGraph.h clang-tools-extra/pseudo/include/clang-pseudo/LRTable.h clang-tools-extra/pseudo/include/clang-pseudo/Token.h clang-tools-extra/pseudo/lib/CMakeLists.txt clang-tools-extra/pseudo/lib/DirectiveMap.cpp clang-tools-extra/pseudo/lib/Grammar.cpp clang-tools-extra/pseudo/lib/GrammarBNF.cpp clang-tools-extra/pseudo/lib/LRGraph.cpp clang-tools-extra/pseudo/lib/LRTable.cpp clang-tools-extra/pseudo/lib/LRTableBuild.cpp clang-tools-extra/pseudo/lib/Lex.cpp clang-tools-extra/pseudo/lib/Token.cpp clang-tools-extra/pseudo/lib/cxx.bnf clang-tools-extra/pseudo/test/CMakeLists.txt clang-tools-extra/pseudo/test/Unit/lit.cfg.py clang-tools-extra/pseudo/test/Unit/lit.site.cfg.py.in clang-tools-extra/pseudo/test/check-cxx-bnf.test clang-tools-extra/pseudo/test/lex.c clang-tools-extra/pseudo/test/lit.cfg.py clang-tools-extra/pseudo/test/lit.local.cfg clang-tools-extra/pseudo/test/lit.site.cfg.py.in clang-tools-extra/pseudo/test/lr-build-basic.test clang-tools-extra/pseudo/test/lr-build-conflicts.test clang-tools-extra/pseudo/tool/CMakeLists.txt clang-tools-extra/pseudo/tool/ClangPseudo.cpp clang-tools-extra/pseudo/unittests/CMakeLists.txt clang-tools-extra/pseudo/unittests/DirectiveMapTest.cpp clang-tools-extra/pseudo/unittests/GrammarTest.cpp clang-tools-extra/pseudo/unittests/LRTableTest.cpp clang-tools-extra/pseudo/unittests/TokenTest.cpp clang/include/clang/Tooling/Syntax/Pseudo/DirectiveMap.h clang/include/clang/Tooling/Syntax/Pseudo/Grammar.h clang/include/clang/Tooling/Syntax/Pseudo/LRGraph.h clang/include/clang/Tooling/Syntax/Pseudo/LRTable.h clang/include/clang/Tooling/Syntax/Pseudo/Token.h clang/lib/Tooling/Syntax/CMakeLists.txt clang/lib/Tooling/Syntax/Pseudo/CMakeLists.txt clang/lib/Tooling/Syntax/Pseudo/DirectiveMap.cpp clang/lib/Tooling/Syntax/Pseudo/Grammar.cpp clang/lib/Tooling/Syntax/Pseudo/GrammarBNF.cpp clang/lib/Tooling/Syntax/Pseudo/LRGraph.cpp clang/lib/Tooling/Syntax/Pseudo/LRTable.cpp clang/lib/Tooling/Syntax/Pseudo/LRTableBuild.cpp clang/lib/Tooling/Syntax/Pseudo/Lex.cpp clang/lib/Tooling/Syntax/Pseudo/README.md clang/lib/Tooling/Syntax/Pseudo/Token.cpp clang/lib/Tooling/Syntax/Pseudo/cxx.bnf clang/test/Syntax/check-cxx-bnf.test clang/test/Syntax/lex.c clang/test/Syntax/lit.local.cfg clang/test/Syntax/lr-build-basic.test clang/test/Syntax/lr-build-conflicts.test clang/tools/CMakeLists.txt clang/tools/clang-pseudo/CMakeLists.txt clang/tools/clang-pseudo/ClangPseudo.cpp clang/unittests/Tooling/Syntax/CMakeLists.txt clang/unittests/Tooling/Syntax/Pseudo/CMakeLists.txt clang/unittests/Tooling/Syntax/Pseudo/DirectiveMapTest.cpp clang/unittests/Tooling/Syntax/Pseudo/GrammarTest.cpp clang/unittests/Tooling/Syntax/Pseudo/LRTableTest.cpp clang/unittests/Tooling/Syntax/Pseudo/TokenTest.cpp
Index: clang/unittests/Tooling/Syntax/CMakeLists.txt =================================================================== --- clang/unittests/Tooling/Syntax/CMakeLists.txt +++ clang/unittests/Tooling/Syntax/CMakeLists.txt @@ -28,5 +28,3 @@ PRIVATE LLVMTestingSupport ) - -add_subdirectory(Pseudo) Index: clang/tools/CMakeLists.txt =================================================================== --- clang/tools/CMakeLists.txt +++ clang/tools/CMakeLists.txt @@ -14,7 +14,6 @@ add_clang_subdirectory(clang-offload-wrapper) add_clang_subdirectory(clang-scan-deps) add_clang_subdirectory(clang-repl) -add_clang_subdirectory(clang-pseudo) add_clang_subdirectory(c-index-test) Index: clang/test/Syntax/lit.local.cfg =================================================================== --- clang/test/Syntax/lit.local.cfg +++ /dev/null @@ -1,4 +0,0 @@ -cxx_bnf_file = os.path.join(config.clang_src_dir, 'lib', 'Tooling', 'Syntax', - 'Pseudo', 'cxx.bnf') -config.substitutions.append(('%cxx-bnf-file', - '%s' % (cxx_bnf_file))) Index: clang/lib/Tooling/Syntax/CMakeLists.txt =================================================================== --- clang/lib/Tooling/Syntax/CMakeLists.txt +++ clang/lib/Tooling/Syntax/CMakeLists.txt @@ -19,5 +19,3 @@ DEPENDS omp_gen ) - -add_subdirectory(Pseudo) Index: clang-tools-extra/pseudo/unittests/TokenTest.cpp =================================================================== --- clang-tools-extra/pseudo/unittests/TokenTest.cpp +++ clang-tools-extra/pseudo/unittests/TokenTest.cpp @@ -6,14 +6,13 @@ // //===----------------------------------------------------------------------===// -#include "clang/Tooling/Syntax/Pseudo/Token.h" +#include "clang-pseudo/Token.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/TokenKinds.h" #include "gmock/gmock.h" #include "gtest/gtest.h" namespace clang { -namespace syntax { namespace pseudo { namespace { @@ -191,5 +190,4 @@ } // namespace } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/unittests/LRTableTest.cpp =================================================================== --- clang-tools-extra/pseudo/unittests/LRTableTest.cpp +++ clang-tools-extra/pseudo/unittests/LRTableTest.cpp @@ -6,15 +6,14 @@ // //===----------------------------------------------------------------------===// -#include "clang/Tooling/Syntax/Pseudo/LRTable.h" +#include "clang-pseudo/LRTable.h" +#include "clang-pseudo/Grammar.h" #include "clang/Basic/TokenKinds.h" -#include "clang/Tooling/Syntax/Pseudo/Grammar.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include <vector> namespace clang { -namespace syntax { namespace pseudo { namespace { @@ -52,5 +51,4 @@ } // namespace } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/unittests/GrammarTest.cpp =================================================================== --- clang-tools-extra/pseudo/unittests/GrammarTest.cpp +++ clang-tools-extra/pseudo/unittests/GrammarTest.cpp @@ -6,13 +6,12 @@ // //===----------------------------------------------------------------------===// -#include "clang/Tooling/Syntax/Pseudo/Grammar.h" +#include "clang-pseudo/Grammar.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include <memory> namespace clang { -namespace syntax { namespace pseudo { namespace { @@ -157,5 +156,4 @@ } // namespace } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/unittests/DirectiveMapTest.cpp =================================================================== --- clang-tools-extra/pseudo/unittests/DirectiveMapTest.cpp +++ clang-tools-extra/pseudo/unittests/DirectiveMapTest.cpp @@ -6,18 +6,17 @@ // //===----------------------------------------------------------------------===// -#include "clang/Tooling/Syntax/Pseudo/DirectiveMap.h" +#include "clang-pseudo/DirectiveMap.h" +#include "clang-pseudo/Token.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/TokenKinds.h" -#include "clang/Tooling/Syntax/Pseudo/Token.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "gmock/gmock.h" #include "gtest/gtest.h" namespace clang { -namespace syntax { namespace pseudo { namespace { @@ -148,5 +147,4 @@ } // namespace } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/unittests/CMakeLists.txt =================================================================== --- clang-tools-extra/pseudo/unittests/CMakeLists.txt +++ clang-tools-extra/pseudo/unittests/CMakeLists.txt @@ -2,7 +2,8 @@ Support ) -add_clang_unittest(ClangPseudoTests +add_custom_target(ClangPseudoUnitTests) +add_unittest(ClangPseudoUnitTests ClangPseudoTests DirectiveMapTest.cpp GrammarTest.cpp LRTableTest.cpp @@ -13,11 +14,10 @@ PRIVATE clangBasic clangLex - clangToolingSyntaxPseudo clangTesting ) target_link_libraries(ClangPseudoTests PRIVATE - LLVMTestingSupport + clangPseudo ) Index: clang-tools-extra/pseudo/tool/ClangPseudo.cpp =================================================================== --- clang-tools-extra/pseudo/tool/ClangPseudo.cpp +++ clang-tools-extra/pseudo/tool/ClangPseudo.cpp @@ -6,18 +6,18 @@ // //===----------------------------------------------------------------------===// +#include "clang-pseudo/DirectiveMap.h" +#include "clang-pseudo/Grammar.h" +#include "clang-pseudo/LRGraph.h" +#include "clang-pseudo/LRTable.h" +#include "clang-pseudo/Token.h" #include "clang/Basic/LangOptions.h" -#include "clang/Tooling/Syntax/Pseudo/DirectiveMap.h" -#include "clang/Tooling/Syntax/Pseudo/Grammar.h" -#include "clang/Tooling/Syntax/Pseudo/LRGraph.h" -#include "clang/Tooling/Syntax/Pseudo/LRTable.h" -#include "clang/Tooling/Syntax/Pseudo/Token.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/MemoryBuffer.h" -using clang::syntax::pseudo::Grammar; +using clang::pseudo::Grammar; using llvm::cl::desc; using llvm::cl::init; using llvm::cl::opt; @@ -64,19 +64,17 @@ if (PrintGrammar) llvm::outs() << G->dump(); if (PrintGraph) - llvm::outs() << clang::syntax::pseudo::LRGraph::buildLR0(*G).dumpForTests( - *G); + llvm::outs() << clang::pseudo::LRGraph::buildLR0(*G).dumpForTests(*G); if (PrintTable) - llvm::outs() << clang::syntax::pseudo::LRTable::buildSLR(*G).dumpForTests( - *G); + llvm::outs() << clang::pseudo::LRTable::buildSLR(*G).dumpForTests(*G); return 0; } if (Source.getNumOccurrences()) { std::string Text = readOrDie(Source); clang::LangOptions LangOpts; // FIXME: use real options. - auto Stream = clang::syntax::pseudo::lex(Text, LangOpts); - auto Structure = clang::syntax::pseudo::DirectiveMap::parse(Stream); + auto Stream = clang::pseudo::lex(Text, LangOpts); + auto Structure = clang::pseudo::DirectiveMap::parse(Stream); if (PrintDirectiveMap) llvm::outs() << Structure; Index: clang-tools-extra/pseudo/tool/CMakeLists.txt =================================================================== --- clang-tools-extra/pseudo/tool/CMakeLists.txt +++ clang-tools-extra/pseudo/tool/CMakeLists.txt @@ -4,12 +4,13 @@ ClangPseudo.cpp ) -set(CLANG_PSEUDO_LIB_DEPS +clang_target_link_libraries(clang-pseudo + PRIVATE clangBasic - clangToolingSyntaxPseudo ) -clang_target_link_libraries(clang-pseudo +target_link_libraries(clang-pseudo PRIVATE - ${CLANG_PSEUDO_LIB_DEPS} + clangPseudo ) + Index: clang/test/Syntax/lr-build-conflicts.test =================================================================== --- /dev/null +++ clang/test/Syntax/lr-build-conflicts.test @@ -1,47 +0,0 @@ -_ := expr -expr := expr - expr # S/R conflict at state 4 on '-' token -expr := IDENTIFIER - -# RUN: clang-pseudo -grammar %s -print-graph | FileCheck %s --check-prefix=GRAPH -# GRAPH: States -# GRAPH-NEXT: State 0 -# GRAPH-NEXT: _ := ⢠expr -# GRAPH-NEXT: expr := ⢠expr - expr -# GRAPH-NEXT: expr := ⢠IDENTIFIER -# GRAPH-NEXT: State 1 -# GRAPH-NEXT: _ := expr ⢠-# GRAPH-NEXT: expr := expr ⢠- expr -# GRAPH-NEXT: State 2 -# GRAPH-NEXT: expr := IDENTIFIER ⢠-# GRAPH-NEXT: State 3 -# GRAPH-NEXT: expr := ⢠expr - expr -# GRAPH-NEXT: expr := expr - ⢠expr -# GRAPH-NEXT: expr := ⢠IDENTIFIER -# GRAPH-NEXT: State 4 -# GRAPH-NEXT: expr := expr - expr ⢠-# GRAPH-NEXT: expr := expr ⢠- expr -# GRAPH-NEXT: 0 ->[expr] 1 -# GRAPH-NEXT: 0 ->[IDENTIFIER] 2 -# GRAPH-NEXT: 1 ->[-] 3 -# GRAPH-NEXT: 3 ->[expr] 4 -# GRAPH-NEXT: 3 ->[IDENTIFIER] 2 -# GRAPH-NEXT: 4 ->[-] 3 - -# RUN: clang-pseudo -grammar %s -print-table | FileCheck %s --check-prefix=TABLE -# TABLE: LRTable: -# TABLE-NEXT: State 0 -# TABLE-NEXT: 'IDENTIFIER': shift state 2 -# TABLE-NEXT: 'expr': go to state 1 -# TABLE-NEXT: State 1 -# TABLE-NEXT: 'EOF': accept -# TABLE-NEXT: '-': shift state 3 -# TABLE-NEXT: State 2 -# TABLE-NEXT: 'EOF': reduce by rule 1 'expr := IDENTIFIER' -# TABLE-NEXT: '-': reduce by rule 1 'expr := IDENTIFIER' -# TABLE-NEXT: State 3 -# TABLE-NEXT: 'IDENTIFIER': shift state 2 -# TABLE-NEXT: 'expr': go to state 4 -# TABLE-NEXT: State 4 -# TABLE-NEXT: 'EOF': reduce by rule 2 'expr := expr - expr' -# TABLE-NEXT: '-': shift state 3 -# TABLE-NEXT: '-': reduce by rule 2 'expr := expr - expr' Index: clang/test/Syntax/lr-build-basic.test =================================================================== --- /dev/null +++ clang/test/Syntax/lr-build-basic.test @@ -1,29 +0,0 @@ -_ := expr -expr := id -id := IDENTIFIER - -# RUN: clang-pseudo -grammar %s -print-graph | FileCheck %s --check-prefix=GRAPH -# GRAPH: States: -# GRPAH-NEXT: State 0 -# GRPAH-NEXT: _ := ⢠expr -# GRPAH-NEXT: expr := ⢠id -# GRPAH-NEXT: id := ⢠IDENTIFIER -# GRPAH-NEXT: State 1 -# GRPAH-NEXT: _ := expr ⢠-# GRPAH-NEXT: State 2 -# GRPAH-NEXT: expr := id ⢠-# GRPAH-NEXT: State 3 -# GRPAH-NEXT: id := IDENTIFIER ⢠- -# RUN: clang-pseudo -grammar %s -print-table | FileCheck %s --check-prefix=TABLE -# TABLE: LRTable: -# TABLE-NEXT: State 0 -# TABLE-NEXT: 'IDENTIFIER': shift state 3 -# TABLE-NEXT: 'expr': go to state 1 -# TABLE-NEXT: 'id': go to state 2 -# TABLE-NEXT: State 1 -# TABLE-NEXT: 'EOF': accept -# TABLE-NEXT: State 2 -# TABLE-NEXT: 'EOF': reduce by rule 1 'expr := id' -# TABLE-NEXT: State 3 -# TABLE-NEXT: 'EOF': reduce by rule 2 'id := IDENTIFIER' Index: clang-tools-extra/pseudo/test/lit.site.cfg.py.in =================================================================== --- /dev/null +++ clang-tools-extra/pseudo/test/lit.site.cfg.py.in @@ -0,0 +1,14 @@ +@LIT_SITE_CFG_IN_HEADER@ + +# Variables needed for common llvm config. +config.clang_tools_dir = "@CLANG_TOOLS_DIR@" +config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@" +config.llvm_tools_dir = lit_config.substitute("@LLVM_TOOLS_DIR@") +config.llvm_libs_dir = lit_config.substitute("@LLVM_LIBS_DIR@") +config.target_triple = "@TARGET_TRIPLE@" +config.python_executable = "@Python3_EXECUTABLE@" + +config.clang_pseudo_source_dir = "@CMAKE_CURRENT_SOURCE_DIR@/.." +config.clang_pseudo_binary_dir = "@CMAKE_CURRENT_BINARY_DIR@/.." +# Delegate logic to lit.cfg.py. +lit_config.load_config(config, "@CMAKE_CURRENT_SOURCE_DIR@/lit.cfg.py") Index: clang-tools-extra/pseudo/test/lit.local.cfg =================================================================== --- /dev/null +++ clang-tools-extra/pseudo/test/lit.local.cfg @@ -0,0 +1,2 @@ +cxx_bnf_file = os.path.join(config.clang_pseudo_source_dir, 'lib', 'cxx.bnf') +config.substitutions.append(('%cxx-bnf-file', cxx_bnf_file)) Index: clang-tools-extra/pseudo/test/lit.cfg.py =================================================================== --- /dev/null +++ clang-tools-extra/pseudo/test/lit.cfg.py @@ -0,0 +1,16 @@ +import lit.llvm + +lit.llvm.initialize(lit_config, config) +lit.llvm.llvm_config.use_default_substitutions() + +config.name = 'ClangPseudo' +config.suffixes = ['.test', '.c', '.cpp'] +config.excludes = ['Inputs'] +config.test_format = lit.formats.ShTest(not lit.llvm.llvm_config.use_lit_shell) +config.test_source_root = config.clang_pseudo_source_dir + "/test" +config.test_exec_root = config.clang_pseudo_binary_dir + "/test" + +config.environment['PATH'] = os.path.pathsep.join(( + config.clang_tools_dir, + config.llvm_tools_dir, + config.environment['PATH'])) Index: clang/test/Syntax/lex.c =================================================================== --- /dev/null +++ clang/test/Syntax/lex.c @@ -1,52 +0,0 @@ -int is_debug() { -#ifndef NDEBUG - return 1; // in debug mode -#else - return 0; -#endif -} - -/* This comment gets lexed along with the input above! We just don't CHECK it. - -RUN: clang-pseudo -source %s -print-source | FileCheck %s -check-prefix=SOURCE --strict-whitespace - SOURCE: int is_debug() { -SOURCE-NEXT: #ifndef NDEBUG -SOURCE-NEXT: return 1; // in debug mode -SOURCE-NEXT: #else -SOURCE-NEXT: return 0; -SOURCE-NEXT: #end -SOURCE-NEXT: } - -RUN: clang-pseudo -source %s -print-tokens | FileCheck %s -check-prefix=TOKEN - TOKEN: 0: raw_identifier 0:0 "int" flags=1 -TOKEN-NEXT: raw_identifier 0:0 "is_debug" -TOKEN-NEXT: l_paren 0:0 "(" -TOKEN-NEXT: r_paren 0:0 ")" -TOKEN-NEXT: l_brace 0:0 "{" -TOKEN-NEXT: hash 1:0 "#" flags=1 -TOKEN-NEXT: raw_identifier 1:0 "ifndef" -TOKEN-NEXT: raw_identifier 1:0 "NDEBUG" -TOKEN-NEXT: raw_identifier 2:2 "return" flags=1 -TOKEN-NEXT: numeric_constant 2:2 "1" -TOKEN-NEXT: semi 2:2 ";" -TOKEN-NEXT: comment 2:2 "// in debug mode" -TOKEN-NEXT: hash 3:0 "#" flags=1 -TOKEN-NEXT: raw_identifier 3:0 "else" -TOKEN-NEXT: raw_identifier 4:2 "return" flags=1 -TOKEN-NEXT: numeric_constant 4:2 "0" -TOKEN-NEXT: semi 4:2 ";" -TOKEN-NEXT: hash 5:0 "#" flags=1 -TOKEN-NEXT: raw_identifier 5:0 "endif" -TOKEN-NEXT: r_brace 6:0 "}" flags=1 - -RUN: clang-pseudo -source %s -print-directive-map | FileCheck %s -check-prefix=PPS --strict-whitespace - PPS: code (5 tokens) -PPS-NEXT: #ifndef (3 tokens) -PPS-NEXT: code (4 tokens) -PPS-NEXT: #else (2 tokens) -PPS-NEXT: code (3 tokens) -PPS-NEXT: #endif (2 tokens) -PPS-NEXT: code (2 tokens) - ^ including this block comment - -*******************************************************************************/ Index: clang/test/Syntax/check-cxx-bnf.test =================================================================== --- /dev/null +++ clang/test/Syntax/check-cxx-bnf.test @@ -1,2 +0,0 @@ -// verify clang/lib/Tooling/Syntax/Pseudo/cxx.bnf -// RUN: clang-pseudo -grammar=%cxx-bnf-file Index: clang-tools-extra/pseudo/test/Unit/lit.site.cfg.py.in =================================================================== --- /dev/null +++ clang-tools-extra/pseudo/test/Unit/lit.site.cfg.py.in @@ -0,0 +1,11 @@ +@LIT_SITE_CFG_IN_HEADER@ +# This is a shim to run the gtest unittests in ../unittests using lit. + +config.llvm_libs_dir = "@LLVM_LIBS_DIR@" +config.shlibdir = "@SHLIBDIR@" + +config.clang_pseudo_source_dir = "@CMAKE_CURRENT_SOURCE_DIR@/.." +config.clang_pseudo_binary_dir = "@CMAKE_CURRENT_BINARY_DIR@/.." + +# Delegate logic to lit.cfg.py. +lit_config.load_config(config, "@CMAKE_CURRENT_SOURCE_DIR@/Unit/lit.cfg.py") Index: clang-tools-extra/pseudo/test/Unit/lit.cfg.py =================================================================== --- /dev/null +++ clang-tools-extra/pseudo/test/Unit/lit.cfg.py @@ -0,0 +1,19 @@ +import lit.formats +config.name = "clangPseudo Unit Tests" +config.test_format = lit.formats.GoogleTest('.', 'Tests') +config.test_source_root = config.clang_pseudo_binary_dir + "/unittests" +config.test_exec_root = config.clang_pseudo_binary_dir + "/unittests" + +# Point the dynamic loader at dynamic libraries in 'lib'. +# FIXME: it seems every project has a copy of this logic. Move it somewhere. +import platform +if platform.system() == 'Darwin': + shlibpath_var = 'DYLD_LIBRARY_PATH' +elif platform.system() == 'Windows': + shlibpath_var = 'PATH' +else: + shlibpath_var = 'LD_LIBRARY_PATH' +config.environment[shlibpath_var] = os.path.pathsep.join(( + "@SHLIBDIR@", "@LLVM_LIBS_DIR@", + config.environment.get(shlibpath_var,''))) + Index: clang-tools-extra/pseudo/test/CMakeLists.txt =================================================================== --- /dev/null +++ clang-tools-extra/pseudo/test/CMakeLists.txt @@ -0,0 +1,38 @@ +# Set CLANG_TOOLS_DIR to buildtree/bin, or buildtree/%(build_mode)s/bin if the +# location is dynamic. The latter must be interpolated by lit configs. +# FIXME: this is duplicated in many places. +if (CMAKE_CFG_INTDIR STREQUAL ".") + set(LLVM_BUILD_MODE ".") +else () + set(LLVM_BUILD_MODE "%(build_mode)s") +endif () +string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} CLANG_TOOLS_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) + +set(CLANG_PSEUDO_TEST_DEPS + clang-pseudo + ClangPseudoTests + ) + +foreach(dep FileCheck not) + if(TARGET ${dep}) + list(APPEND CLANG_PSEUDO_TEST_DEPS ${dep}) + endif() +endforeach() + +configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in + ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py + MAIN_CONFIG + ${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py + ) + +configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.py.in + ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg.py + MAIN_CONFIG + ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.cfg.py + ) + +add_lit_testsuite(check-clang-pseudo "Running the clang-pseudo regression tests" + ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${CLANG_PSEUDO_TEST_DEPS}) Index: clang/lib/Tooling/Syntax/Pseudo/cxx.bnf =================================================================== --- /dev/null +++ clang/lib/Tooling/Syntax/Pseudo/cxx.bnf @@ -1,739 +0,0 @@ -# This is a C++ grammar from the C++ standard [1]. -# -# The grammar is a superset of the true grammar requring semantic constraints to -# resolve ambiguties. The grammar is context-free and ambiguous (beyond the -# limit of LR(k)). We use general parsing algorithm (e.g GLR) to handle the -# grammar and generate a transition table which is used to drive the parsing. -# -# It aims to align with the ISO C++ grammar as much as possible. We adjust it -# to fit the need for the grammar-based parser: -# - attributes are omitted, which will be handled as comments; -# - we don't allow nullable non-terminal symbols. There are few nullable -# non-terminals in the spec grammar, they are adjusted to be non-nullable; -# - the file merely describes the core C++ grammar. Preprocessor directives and -# lexical conversions are omitted as we reuse clang's lexer and run a fake -# preprocessor; -# -# Guidelines: -# - non-terminals are lower_case; terminals (aka tokens) correspond to -# clang::TokenKind, written as "IDENTIFIER", "USING", "::" etc; -# - optional symbols are supported, with a _opt suffix; -# -# [1] https://isocpp.org/files/papers/N4860.pdf -# -# -# _ serves as a "fake" start symbol, coming with real grammar symbols. -_ := translation-unit - -# gram.key -typedef-name := IDENTIFIER -typedef-name := simple-template-id -namespace-name := IDENTIFIER -namespace-name := namespace-alias -namespace-alias := IDENTIFIER -class-name := IDENTIFIER -class-name := simple-template-id -enum-name := IDENTIFIER -template-name := IDENTIFIER - -# gram.basic -#! Custom modifications to eliminate optional declaration-seq -translation-unit := declaration-seq -translation-unit := global-module-fragment_opt module-declaration declaration-seq_opt private-module-fragment_opt - -# gram.expr -# expr.prim -primary-expression := literal -primary-expression := THIS -primary-expression := ( expression ) -primary-expression := id-expression -primary-expression := lambda-expression -primary-expression := fold-expression -primary-expression := requires-expression -id-expression := unqualified-id -id-expression := qualified-id -unqualified-id := IDENTIFIER -unqualified-id := operator-function-id -unqualified-id := conversion-function-id -unqualified-id := literal-operator-id -unqualified-id := ~ type-name -unqualified-id := ~ decltype-specifier -unqualified-id := template-id -qualified-id := nested-name-specifier TEMPLATE_opt unqualified-id -nested-name-specifier := :: -nested-name-specifier := type-name :: -nested-name-specifier := namespace-name :: -nested-name-specifier := decltype-specifier :: -nested-name-specifier := nested-name-specifier IDENTIFIER :: -nested-name-specifier := nested-name-specifier TEMPLATE_opt simple-template-id :: -lambda-expression := lambda-introducer lambda-declarator_opt compound-statement -lambda-expression := lambda-introducer < template-parameter-list > requires-clause_opt lambda-declarator_opt compound-statement -lambda-introducer := [ lambda-capture_opt ] -lambda-declarator := ( parameter-declaration-clause_opt ) decl-specifier-seq_opt noexcept-specifier_opt trailing-return-type_opt requires-clause_opt -lambda-capture := capture-default -lambda-capture := capture-list -lambda-capture := capture-default , capture-list -capture-default := & -capture-default := = -capture-list := capture -capture-list := capture-list , capture -capture := simple-capture -capture := init-capture -simple-capture := IDENTIFIER ..._opt -simple-capture := & IDENTIFIER ..._opt -simple-capture := THIS -simple-capture := * THIS -init-capture := ..._opt IDENTIFIER initializer -init-capture := & ..._opt IDENTIFIER initializer -fold-expression := ( cast-expression fold-operator ... ) -fold-expression := ( ... fold-operator cast-expression ) -fold-expression := ( cast-expression fold-operator ... fold-operator cast-expression ) -fold-operator := + -fold-operator := - -fold-operator := * -fold-operator := / -fold-operator := % -fold-operator := ^ -fold-operator := | -fold-operator := << -fold-operator := >> -fold-operator := += -fold-operator := -= -fold-operator := *= -fold-operator := /= -fold-operator := %= -fold-operator := ^= -fold-operator := &= -fold-operator := |= -fold-operator := <<= -fold-operator := >>= -fold-operator := = -fold-operator := == -fold-operator := != -fold-operator := < -fold-operator := > -fold-operator := <= -fold-operator := >= -fold-operator := && -fold-operator := || -fold-operator := , -fold-operator := .* -fold-operator := ->* -requires-expression := REQUIRES requirement-parameter-list_opt requirement-body -requirement-parameter-list := ( parameter-declaration-clause_opt ) -requirement-body := { requirement-seq } -requirement-seq := requirement -requirement-seq := requirement-seq requirement -requirement := simple-requirement -requirement := type-requirement -requirement := compound-requirement -requirement := nested-requirement -simple-requirement := expression ; -type-requirement := TYPENAME nested-name-specifier_opt type-name ; -compound-requirement := { expression } NOEXCEPT_opt return-type-requirement_opt ; -return-type-requirement := -> type-constraint -nested-requirement := REQUIRES constraint-expression ; -# expr.post -postfix-expression := primary-expression -postfix-expression := postfix-expression [ expr-or-braced-init-list ] -postfix-expression := postfix-expression ( expression-list_opt ) -postfix-expression := simple-type-specifier ( expression-list_opt ) -postfix-expression := typename-specifier ( expression-list_opt ) -postfix-expression := simple-type-specifier braced-init-list -postfix-expression := postfix-expression . TEMPLATE_opt id-expression -postfix-expression := postfix-expression -> TEMPLATE_opt id-expression -postfix-expression := postfix-expression ++ -postfix-expression := postfix-expression -- -postfix-expression := DYNAMIC_CAST < type-id > ( expression ) -postfix-expression := STATIC_CAST < type-id > ( expression ) -postfix-expression := REINTERPRET_CAST < type-id > ( expression ) -postfix-expression := CONST_CAST < type-id > ( expression ) -postfix-expression := TYPEID ( expression ) -postfix-expression := TYPEID ( type-id ) -expression-list := initializer-list -# expr.unary -unary-expression := postfix-expression -unary-expression := unary-operator cast-expression -unary-expression := ++ cast-expression -unary-expression := -- cast-expression -unary-expression := await-expression -unary-expression := SIZEOF unary-expression -unary-expression := SIZEOF ( type-id ) -unary-expression := SIZEOF ... ( IDENTIFIER ) -unary-expression := ALIGNOF ( type-id ) -unary-expression := noexcept-expression -unary-expression := new-expression -unary-expression := delete-expression -unary-operator := * -unary-operator := & -unary-operator := + -unary-operator := - -unary-operator := ! -unary-operator := ~ -await-expression := CO_AWAIT cast-expression -noexcept-expression := NOEXCEPT ( expression ) -new-expression := ::_opt NEW new-placement_opt new-type-id new-initializer_opt -new-expression := ::_opt NEW new-placement_opt ( type-id ) new-initializer_opt -new-placement := ( expression-list ) -new-type-id := type-specifier-seq new-declarator_opt -new-declarator := ptr-operator new-declarator_opt -new-declarator := noptr-new-declarator -noptr-new-declarator := [ expression_opt ] -noptr-new-declarator := noptr-new-declarator [ constant-expression ] -new-initializer := ( expression-list_opt ) -new-initializer := braced-init-list -delete-expression := ::_opt DELETE cast-expression -delete-expression := ::_opt DELETE [ ] cast-expression -cast-expression := unary-expression -cast-expression := ( type-id ) cast-expression -# expr.mptr.oper -pm-expression := cast-expression -pm-expression := pm-expression .* cast-expression -pm-expression := pm-expression ->* cast-expression -# expr.mul -multiplicative-expression := pm-expression -multiplicative-expression := multiplicative-expression * pm-expression -multiplicative-expression := multiplicative-expression / pm-expression -multiplicative-expression := multiplicative-expression % pm-expression -# expr.add -additive-expression := multiplicative-expression -additive-expression := additive-expression + multiplicative-expression -additive-expression := additive-expression - multiplicative-expression -# expr.shift -shift-expression := additive-expression -shift-expression := shift-expression << additive-expression -shift-expression := shift-expression >> additive-expression -# expr.spaceship -compare-expression := shift-expression -compare-expression := compare-expression <=> shift-expression -# expr.rel -relational-expression := compare-expression -relational-expression := relational-expression < compare-expression -relational-expression := relational-expression > compare-expression -relational-expression := relational-expression <= compare-expression -relational-expression := relational-expression >= compare-expression -# expr.eq -equality-expression := relational-expression -equality-expression := equality-expression == relational-expression -equality-expression := equality-expression != relational-expression -# expr.bit.and -and-expression := equality-expression -and-expression := and-expression & equality-expression -# expr.xor -exclusive-or-expression := and-expression -exclusive-or-expression := exclusive-or-expression ^ and-expression -# expr.or -inclusive-or-expression := exclusive-or-expression -inclusive-or-expression := inclusive-or-expression | exclusive-or-expression -# expr.log.and -logical-and-expression := inclusive-or-expression -logical-and-expression := logical-and-expression && inclusive-or-expression -# expr.log.or -logical-or-expression := logical-and-expression -logical-or-expression := logical-or-expression || logical-and-expression -# expr.cond -conditional-expression := logical-or-expression -conditional-expression := logical-or-expression ? expression : assignment-expression -# expr.ass -yield-expression := CO_YIELD assignment-expression -yield-expression := CO_YIELD braced-init-list -throw-expression := THROW assignment-expression_opt -assignment-expression := conditional-expression -assignment-expression := yield-expression -assignment-expression := throw-expression -assignment-expression := logical-or-expression assignment-operator initializer-clause -assignment-operator := = -assignment-operator := *= -assignment-operator := /= -assignment-operator := %= -assignment-operator := += -assignment-operator := -= -assignment-operator := >>= -assignment-operator := <<= -assignment-operator := &= -assignment-operator := ^= -assignment-operator := |= -# expr.comma -expression := assignment-expression -expression := expression , assignment-expression -# expr.const -constant-expression := conditional-expression - -# gram.stmt -statement := labeled-statement -statement := expression-statement -statement := compound-statement -statement := selection-statement -statement := iteration-statement -statement := jump-statement -statement := declaration-statement -statement := try-block -init-statement := expression-statement -init-statement := simple-declaration -condition := expression -condition := decl-specifier-seq declarator brace-or-equal-initializer -labeled-statement := IDENTIFIER : statement -labeled-statement := CASE constant-expression : statement -labeled-statement := DEFAULT : statement -expression-statement := expression_opt ; -compound-statement := { statement-seq_opt } -statement-seq := statement -statement-seq := statement-seq statement -selection-statement := IF CONSTEXPR_opt ( init-statement_opt condition ) statement -selection-statement := IF CONSTEXPR_opt ( init-statement_opt condition ) statement ELSE statement -selection-statement := SWITCH ( init-statement_opt condition ) statement -iteration-statement := WHILE ( condition ) statement -iteration-statement := DO statement WHILE ( expression ) ; -iteration-statement := FOR ( init-statement condition_opt ; expression_opt ) statement -iteration-statement := FOR ( init-statement_opt for-range-declaration : for-range-initializer ) statement -for-range-declaration := decl-specifier-seq declarator -for-range-declaration := decl-specifier-seq ref-qualifier_opt [ identifier-list ] -for-range-initializer := expr-or-braced-init-list -jump-statement := BREAK ; -jump-statement := CONTINUE ; -jump-statement := RETURN expr-or-braced-init-list_opt ; -jump-statement := coroutine-return-statement -jump-statement := GOTO IDENTIFIER ; -coroutine-return-statement := CO_RETURN expr-or-braced-init-list_opt ; -declaration-statement := block-declaration - -# gram.dcl -declaration-seq := declaration -declaration-seq := declaration-seq declaration -declaration := block-declaration -declaration := nodeclspec-function-declaration -declaration := function-definition -declaration := template-declaration -declaration := deduction-guide -declaration := explicit-instantiation -declaration := explicit-specialization -declaration := export-declaration -declaration := linkage-specification -declaration := namespace-definition -declaration := empty-declaration -declaration := module-import-declaration -block-declaration := simple-declaration -block-declaration := asm-declaration -block-declaration := namespace-alias-definition -block-declaration := using-declaration -block-declaration := using-enum-declaration -block-declaration := using-directive -block-declaration := static_assert-declaration -block-declaration := alias-declaration -block-declaration := opaque-enum-declaration -nodeclspec-function-declaration := declarator ; -alias-declaration := USING IDENTIFIER = defining-type-id ; -simple-declaration := decl-specifier-seq init-declarator-list_opt ; -simple-declaration := decl-specifier-seq ref-qualifier_opt [ identifier-list ] initializer ; -static_assert-declaration := STATIC_ASSERT ( constant-expression ) ; -static_assert-declaration := STATIC_ASSERT ( constant-expression , string-literal ) ; -empty-declaration := ; -# dcl.spec -decl-specifier := storage-class-specifier -decl-specifier := defining-type-specifier -decl-specifier := function-specifier -decl-specifier := FRIEND -decl-specifier := TYPEDEF -decl-specifier := CONSTEXPR -decl-specifier := CONSTEVAL -decl-specifier := CONSTINIT -decl-specifier := INLINE -decl-specifier-seq := decl-specifier -decl-specifier-seq := decl-specifier decl-specifier-seq -storage-class-specifier := STATIC -storage-class-specifier := THREAD_LOCAL -storage-class-specifier := EXTERN -storage-class-specifier := MUTABLE -function-specifier := VIRTUAL -function-specifier := explicit-specifier -explicit-specifier := EXPLICIT ( constant-expression ) -explicit-specifier := EXPLICIT -type-specifier := simple-type-specifier -type-specifier := elaborated-type-specifier -type-specifier := typename-specifier -type-specifier := cv-qualifier -type-specifier-seq := type-specifier -type-specifier-seq := type-specifier type-specifier-seq -defining-type-specifier := type-specifier -defining-type-specifier := class-specifier -defining-type-specifier := enum-specifier -defining-type-specifier-seq := defining-type-specifier -defining-type-specifier-seq := defining-type-specifier defining-type-specifier-seq -simple-type-specifier := nested-name-specifier_opt type-name -simple-type-specifier := nested-name-specifier TEMPLATE simple-template-id -simple-type-specifier := decltype-specifier -simple-type-specifier := placeholder-type-specifier -simple-type-specifier := nested-name-specifier_opt template-name -simple-type-specifier := CHAR -simple-type-specifier := CHAR8_T -simple-type-specifier := CHAR16_T -simple-type-specifier := CHAR32_T -simple-type-specifier := WCHAR_T -simple-type-specifier := BOOL -simple-type-specifier := SHORT -simple-type-specifier := INT -simple-type-specifier := LONG -simple-type-specifier := SIGNED -simple-type-specifier := UNSIGNED -simple-type-specifier := FLOAT -simple-type-specifier := DOUBLE -simple-type-specifier := VOID -type-name := class-name -type-name := enum-name -type-name := typedef-name -elaborated-type-specifier := class-key nested-name-specifier_opt IDENTIFIER -elaborated-type-specifier := class-key simple-template-id -elaborated-type-specifier := class-key nested-name-specifier TEMPLATE_opt simple-template-id -elaborated-type-specifier := elaborated-enum-specifier -elaborated-enum-specifier := ENUM nested-name-specifier_opt IDENTIFIER -decltype-specifier := DECLTYPE ( expression ) -placeholder-type-specifier := type-constraint_opt AUTO -placeholder-type-specifier := type-constraint_opt DECLTYPE ( AUTO ) -init-declarator-list := init-declarator -init-declarator-list := init-declarator-list , init-declarator -init-declarator := declarator initializer_opt -init-declarator := declarator requires-clause -declarator := ptr-declarator -declarator := noptr-declarator parameters-and-qualifiers trailing-return-type -ptr-declarator := noptr-declarator -ptr-declarator := ptr-operator ptr-declarator -noptr-declarator := declarator-id -noptr-declarator := noptr-declarator parameters-and-qualifiers -noptr-declarator := noptr-declarator [ constant-expression_opt ] -noptr-declarator := ( ptr-declarator ) -parameters-and-qualifiers := ( parameter-declaration-list_opt ) cv-qualifier-seq_opt ref-qualifier_opt noexcept-specifier_opt -trailing-return-type := -> type-id -ptr-operator := * cv-qualifier-seq_opt -ptr-operator := & -ptr-operator := && -ptr-operator := nested-name-specifier * cv-qualifier-seq_opt -cv-qualifier-seq := cv-qualifier cv-qualifier-seq_opt -cv-qualifier := CONST -cv-qualifier := VOLATILE -ref-qualifier := & -ref-qualifier := && -declarator-id := ..._opt id-expression -type-id := type-specifier-seq abstract-declarator_opt -defining-type-id := defining-type-specifier-seq abstract-declarator_opt -abstract-declarator := ptr-abstract-declarator -abstract-declarator := noptr-abstract-declarator_opt parameters-and-qualifiers trailing-return-type -abstract-declarator := abstract-pack-declarator -ptr-abstract-declarator := noptr-abstract-declarator -ptr-abstract-declarator := ptr-operator ptr-abstract-declarator_opt -noptr-abstract-declarator := noptr-abstract-declarator_opt parameters-and-qualifiers -noptr-abstract-declarator := noptr-abstract-declarator_opt [ constant-expression ] -noptr-abstract-declarator := ( ptr-abstract-declarator ) -abstract-pack-declarator := noptr-abstract-pack-declarator -abstract-pack-declarator := ptr-operator abstract-pack-declarator -noptr-abstract-pack-declarator := noptr-abstract-pack-declarator parameters-and-qualifiers -noptr-abstract-pack-declarator := noptr-abstract-pack-declarator [ constant-expression_opt ] -noptr-abstract-pack-declarator := ... -#! Custom modifications to avoid nullable clause. -parameter-declaration-clause := parameter-declaration-list -parameter-declaration-clause := parameter-declaration-list_opt ... -parameter-declaration-clause := parameter-declaration-list , ... -parameter-declaration-list := parameter-declaration -parameter-declaration-list := parameter-declaration-list , parameter-declaration -parameter-declaration := decl-specifier-seq declarator -parameter-declaration := decl-specifier-seq declarator = initializer-clause -parameter-declaration := decl-specifier-seq abstract-declarator_opt -parameter-declaration := decl-specifier-seq abstract-declarator_opt = initializer-clause -# dcl.init -initializer := brace-or-equal-initializer -initializer := ( expression-list ) -brace-or-equal-initializer := = initializer-clause -brace-or-equal-initializer := braced-init-list -initializer-clause := assignment-expression -initializer-clause := braced-init-list -braced-init-list := { initializer-list ,_opt } -braced-init-list := { designated-initializer-list ,_opt } -braced-init-list := { } -initializer-list := initializer-clause ..._opt -initializer-list := initializer-list , initializer-clause ..._opt -designated-initializer-list := designated-initializer-clause -designated-initializer-list := designated-initializer-list , designated-initializer-clause -designated-initializer-clause := designator brace-or-equal-initializer -designator := . IDENTIFIER -expr-or-braced-init-list := expression -expr-or-braced-init-list := braced-init-list -# dcl.fct -function-definition := decl-specifier-seq_opt declarator virt-specifier-seq_opt function-body -function-definition := decl-specifier-seq_opt declarator requires-clause function-body -function-body := ctor-initializer_opt compound-statement -function-body := function-try-block -function-body := = DEFAULT ; -function-body := = DELETE ; -# dcl.enum -enum-specifier := enum-head { enumerator-list_opt } -enum-specifier := enum-head { enumerator-list , } -enum-head := enum-key enum-head-name_opt enum-base_opt -enum-head-name := nested-name-specifier_opt IDENTIFIER -opaque-enum-declaration := enum-key enum-head-name enum-base_opt ; -enum-key := ENUM -enum-key := ENUM CLASS -enum-key := ENUM STRUCT -enum-base := : type-specifier-seq -enumerator-list := enumerator-definition -enumerator-list := enumerator-list , enumerator-definition -enumerator-definition := enumerator -enumerator-definition := enumerator = constant-expression -enumerator := IDENTIFIER -using-enum-declaration := USING elaborated-enum-specifier ; -# basic.namespace -namespace-definition := named-namespace-definition -namespace-definition := unnamed-namespace-definition -namespace-definition := nested-namespace-definition -named-namespace-definition := INLINE_opt NAMESPACE IDENTIFIER { namespace-body_opt } -unnamed-namespace-definition := INLINE_opt NAMESPACE { namespace-body_opt } -nested-namespace-definition := NAMESPACE enclosing-namespace-specifier :: INLINE_opt IDENTIFIER { namespace-body } -enclosing-namespace-specifier := IDENTIFIER -enclosing-namespace-specifier := enclosing-namespace-specifier :: INLINE_opt IDENTIFIER -#! Custom modification to avoid nullable namespace-body. -namespace-body := declaration-seq -namespace-alias-definition := NAMESPACE IDENTIFIER = qualified-namespace-specifier ; -qualified-namespace-specifier := nested-name-specifier_opt namespace-name -using-directive := USING NAMESPACE nested-name-specifier_opt namespace-name ; -using-declaration := USING using-declarator-list ; -using-declarator-list := using-declarator ..._opt -using-declarator-list := using-declarator-list , using-declarator ..._opt -using-declarator := TYPENAME_opt nested-name-specifier unqualified-id -# dcl.asm -asm-declaration := ASM ( string-literal ) ; -# dcl.link -linkage-specification := EXTERN string-literal { declaration-seq_opt } -linkage-specification := EXTERN string-literal declaration - -# gram.module -module-declaration := export-keyword_opt module-keyword module-name module-partition_opt -module-name := module-name-qualifier_opt IDENTIFIER -module-partition := : module-name-qualifier_opt IDENTIFIER -module-name-qualifier := IDENTIFIER . -module-name-qualifier := module-name-qualifier IDENTIFIER . -export-declaration := EXPORT declaration -export-declaration := EXPORT ( declaration-seq_opt ) -export-declaration := export-keyword module-import-declaration -module-import-declaration := import-keyword module-name -module-import-declaration := import-keyword module-partition -# FIXME: we don't have header-name in the grammar. Handle these in PP? -# module-import-declaration := import-keyword header-name -global-module-fragment := module-keyword ; declaration-seq_opt -private-module-fragment := module-keyword : PRIVATE ; declaration-seq_opt - -# gram.class -class-specifier := class-head { member-specification_opt } -class-head := class-key class-head-name class-virt-specifier_opt base-clause_opt -class-head := class-key base-clause_opt -class-head-name := nested-name-specifier_opt class-name -class-virt-specifier := contextual-final -class-key := CLASS -class-key := STRUCT -class-key := UNION -member-specification := member-declaration member-specification_opt -member-specification := access-specifier : member-declaration member-specification_opt -member-declaration := decl-specifier-seq_opt member-declarator-list_opt ; -member-declaration := function-definition -member-declaration := using-declaration -member-declaration := using-enum-declaration -member-declaration := static_assert-declaration -member-declaration := template-declaration -member-declaration := explicit-specialization -member-declaration := deduction-guide -member-declaration := alias-declaration -member-declaration := opaque-enum-declaration -member-declaration := empty-declaration -member-declarator-list := member-declarator -member-declarator-list := member-declarator-list , member-declarator -member-declarator := declarator virt-specifier-seq_opt pure-specifier_opt -member-declarator := declarator requires-clause -member-declarator := declarator brace-or-equal-initializer -member-declarator := IDENTIFIER_opt : constant-expression brace-or-equal-initializer_opt -virt-specifier-seq := virt-specifier -virt-specifier-seq := virt-specifier-seq virt-specifier -virt-specifier := contextual-override -virt-specifier := contextual-final -pure-specifier := = contextual-zero -conversion-function-id := OPERATOR conversion-type-id -conversion-type-id := type-specifier-seq conversion-declarator_opt -conversion-declarator := ptr-operator conversion-declarator_opt -base-clause := : base-specifier-list -base-specifier-list := base-specifier ..._opt -base-specifier-list := base-specifier-list , base-specifier ..._opt -base-specifier := class-or-decltype -base-specifier := VIRTUAL access-specifier_opt class-or-decltype -base-specifier := access-specifier VIRTUAL_opt class-or-decltype -class-or-decltype := nested-name-specifier_opt type-name -class-or-decltype := nested-name-specifier TEMPLATE simple-template-id -class-or-decltype := decltype-specifier -access-specifier := PRIVATE -access-specifier := PROTECTED -access-specifier := PUBLIC -ctor-initializer := : mem-initializer-list -mem-initializer-list := mem-initializer ..._opt -mem-initializer-list := mem-initializer-list , mem-initializer ..._opt -mem-initializer := mem-initializer-id ( expression-list_opt ) -mem-initializer := mem-initializer-id braced-init-list -mem-initializer-id := class-or-decltype -mem-initializer-id := IDENTIFIER - -# gram.over -operator-function-id := OPERATOR operator-name -operator-name := NEW -operator-name := DELETE -operator-name := NEW [ ] -operator-name := DELETE [ ] -operator-name := CO_AWAIT -operator-name := ( ) -operator-name := [ ] -operator-name := -> -operator-name := ->* -operator-name := ~ -operator-name := ! -operator-name := + -operator-name := - -operator-name := * -operator-name := / -operator-name := % -operator-name := ^ -operator-name := & -operator-name := | -operator-name := = -operator-name := += -operator-name := -= -operator-name := *= -operator-name := /= -operator-name := %= -operator-name := ^= -operator-name := &= -operator-name := |= -operator-name := == -operator-name := != -operator-name := < -operator-name := > -operator-name := <= -operator-name := >= -operator-name := <=> -operator-name := ^^ -operator-name := || -operator-name := << -operator-name := >> -operator-name := <<= -operator-name := >>= -operator-name := ++ -operator-name := -- -operator-name := , -literal-operator-id := OPERATOR string-literal IDENTIFIER -literal-operator-id := OPERATOR user-defined-string-literal - -# gram.temp -template-declaration := template-head declaration -template-declaration := template-head concept-definition -template-head := TEMPLATE < template-parameter-list > requires-clause_opt -template-parameter-list := template-parameter -template-parameter-list := template-parameter-list , template-parameter -requires-clause := REQUIRES constraint-logical-or-expression -constraint-logical-or-expression := constraint-logical-and-expression -constraint-logical-or-expression := constraint-logical-or-expression || constraint-logical-and-expression -constraint-logical-and-expression := primary-expression -constraint-logical-and-expression := constraint-logical-and-expression && primary-expression -template-parameter := type-parameter -template-parameter := parameter-declaration -type-parameter := type-parameter-key ..._opt IDENTIFIER -type-parameter := type-parameter-key IDENTIFIER_opt = type-id -type-parameter := type-constraint ..._opt IDENTIFIER_opt -type-parameter := type-constraint IDENTIFIER_opt = type-id -type-parameter := template-head type-parameter-key ..._opt IDENTIFIER_opt -type-parameter := template-head type-parameter-key IDENTIFIER_opt = id-expression -type-parameter-key := CLASS -type-parameter-key := TYPENAME -type-constraint := nested-name-specifier_opt concept-name -type-constraint := nested-name-specifier_opt concept-name < template-argument-list_opt > -simple-template-id := template-name < template-argument-list_opt > -template-id := simple-template-id -template-id := operator-function-id < template-argument-list_opt > -template-id := literal-operator-id < template-argument-list_opt > -template-argument-list := template-argument ..._opt -template-argument-list := template-argument-list , template-argument ..._opt -template-argument := constant-expression -template-argument := type-id -template-argument := id-expression -constraint-expression := logical-or-expression -deduction-guide := explicit-specifier_opt template-name ( parameter-declaration-list_opt ) -> simple-template-id ; -concept-definition := CONCEPT concept-name = constraint-expression ; -concept-name := IDENTIFIER -typename-specifier := TYPENAME nested-name-specifier IDENTIFIER -typename-specifier := TYPENAME nested-name-specifier TEMPLATE_opt simple-template-id -explicit-instantiation := EXTERN_opt TEMPLATE declaration -explicit-specialization := TEMPLATE < > declaration - -# gram.except -try-block := TRY compound-statement handler-seq -function-try-block := TRY ctor-initializer_opt compound-statement handler-seq -handler-seq := handler handler-seq_opt -handler := CATCH ( exception-declaration ) compound-statement -exception-declaration := type-specifier-seq declarator -exception-declaration := type-specifier-seq abstract-declarator_opt -noexcept-specifier := NOEXCEPT ( constant-expression ) -noexcept-specifier := NOEXCEPT - -# gram.cpp -identifier-list := IDENTIFIER -identifier-list := identifier-list , IDENTIFIER - -# gram.lex -#! As we use clang lexer, most of lexical symbols are not needed, we only add -#! needed literals. -literal := integer-literal -literal := character-literal -literal := floating-point-literal -literal := string-literal -literal := boolean-literal -literal := pointer-literal -literal := user-defined-literal -integer-literal := NUMERIC_CONSTANT -character-literal := CHAR_CONSTANT -character-literal := WIDE_CHAR_CONSTANT -character-literal := UTF8_CHAR_CONSTANT -character-literal := UTF16_CHAR_CONSTANT -character-literal := UTF32_CHAR_CONSTANT -floating-point-literal := NUMERIC_CONSTANT -string-literal-chunk := STRING_LITERAL -string-literal-chunk := WIDE_STRING_LITERAL -string-literal-chunk := UTF8_STRING_LITERAL -string-literal-chunk := UTF16_STRING_LITERAL -string-literal-chunk := UTF32_STRING_LITERAL -#! Technically, string concatenation happens at phase 6 which is before parsing, -#! so it doesn't belong to the grammar. However, we extend the grammar to -#! support it, to make the pseudo parser fully functional on practical code. -string-literal := string-literal-chunk -string-literal := string-literal string-literal-chunk -user-defined-literal := user-defined-integer-literal -user-defined-literal := user-defined-floating-point-literal -user-defined-literal := user-defined-string-literal -user-defined-literal := user-defined-character-literal -user-defined-integer-literal := NUMERIC_CONSTANT -user-defined-string-literal-chunk := STRING_LITERAL -user-defined-string-literal-chunk := WIDE_STRING_LITERAL -user-defined-string-literal-chunk := UTF8_STRING_LITERAL -user-defined-string-literal-chunk := UTF16_STRING_LITERAL -user-defined-string-literal-chunk := UTF32_STRING_LITERAL -user-defined-string-literal := user-defined-string-literal-chunk -user-defined-string-literal := string-literal-chunk user-defined-string-literal -user-defined-string-literal := user-defined-string-literal string-literal-chunk -user-defined-floating-point-literal := NUMERIC_CONSTANT -user-defined-character-literal := CHAR_CONSTANT -user-defined-character-literal := WIDE_CHAR_CONSTANT -user-defined-character-literal := UTF8_CHAR_CONSTANT -user-defined-character-literal := UTF16_CHAR_CONSTANT -user-defined-character-literal := UTF32_CHAR_CONSTANT -boolean-literal := FALSE -boolean-literal := TRUE -pointer-literal := NULLPTR - -#! Contextual keywords -- clang lexer always lexes them as identifier tokens. -#! Placeholders for literal text in the grammar that lex as other things. -contextual-override := IDENTIFIER -contextual-final := IDENTIFIER -contextual-zero := NUMERIC_CONSTANT -module-keyword := IDENTIFIER -import-keyword := IDENTIFIER -export-keyword := IDENTIFIER Index: clang-tools-extra/pseudo/lib/Token.cpp =================================================================== --- clang-tools-extra/pseudo/lib/Token.cpp +++ clang-tools-extra/pseudo/lib/Token.cpp @@ -6,13 +6,12 @@ // //===----------------------------------------------------------------------===// -#include "clang/Tooling/Syntax/Pseudo/Token.h" +#include "clang-pseudo/Token.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/Format.h" #include "llvm/Support/FormatVariadic.h" namespace clang { -namespace syntax { namespace pseudo { llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Token &T) { @@ -105,5 +104,4 @@ } } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/lib/Lex.cpp =================================================================== --- clang-tools-extra/pseudo/lib/Lex.cpp +++ clang-tools-extra/pseudo/lib/Lex.cpp @@ -6,14 +6,13 @@ // //===----------------------------------------------------------------------===// +#include "clang-pseudo/Token.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/TokenKinds.h" #include "clang/Lex/Lexer.h" #include "clang/Lex/LiteralSupport.h" -#include "clang/Tooling/Syntax/Pseudo/Token.h" namespace clang { -namespace syntax { namespace pseudo { TokenStream lex(const std::string &Code, const clang::LangOptions &LangOpts) { @@ -110,5 +109,4 @@ } } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/lib/LRTableBuild.cpp =================================================================== --- clang-tools-extra/pseudo/lib/LRTableBuild.cpp +++ clang-tools-extra/pseudo/lib/LRTableBuild.cpp @@ -6,23 +6,23 @@ // //===----------------------------------------------------------------------===// +#include "clang-pseudo/Grammar.h" +#include "clang-pseudo/LRGraph.h" +#include "clang-pseudo/LRTable.h" #include "clang/Basic/TokenKinds.h" -#include "clang/Tooling/Syntax/Pseudo/Grammar.h" -#include "clang/Tooling/Syntax/Pseudo/LRGraph.h" -#include "clang/Tooling/Syntax/Pseudo/LRTable.h" #include <cstdint> namespace llvm { -template <> struct DenseMapInfo<clang::syntax::pseudo::LRTable::Entry> { - using Entry = clang::syntax::pseudo::LRTable::Entry; +template <> struct DenseMapInfo<clang::pseudo::LRTable::Entry> { + using Entry = clang::pseudo::LRTable::Entry; static inline Entry getEmptyKey() { - static Entry E{static_cast<clang::syntax::pseudo::SymbolID>(-1), 0, - clang::syntax::pseudo::LRTable::Action::sentinel()}; + static Entry E{static_cast<clang::pseudo::SymbolID>(-1), 0, + clang::pseudo::LRTable::Action::sentinel()}; return E; } static inline Entry getTombstoneKey() { - static Entry E{static_cast<clang::syntax::pseudo::SymbolID>(-2), 0, - clang::syntax::pseudo::LRTable::Action::sentinel()}; + static Entry E{static_cast<clang::pseudo::SymbolID>(-2), 0, + clang::pseudo::LRTable::Action::sentinel()}; return E; } static unsigned getHashValue(const Entry &I) { @@ -36,7 +36,6 @@ } // namespace llvm namespace clang { -namespace syntax { namespace pseudo { class LRTable::Builder { @@ -139,5 +138,4 @@ } } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/lib/LRTable.cpp =================================================================== --- clang-tools-extra/pseudo/lib/LRTable.cpp +++ clang-tools-extra/pseudo/lib/LRTable.cpp @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#include "clang/Tooling/Syntax/Pseudo/LRTable.h" -#include "clang/Tooling/Syntax/Pseudo/Grammar.h" +#include "clang-pseudo/LRTable.h" +#include "clang-pseudo/Grammar.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/ErrorHandling.h" @@ -15,7 +15,6 @@ #include "llvm/Support/raw_ostream.h" namespace clang { -namespace syntax { namespace pseudo { llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const LRTable::Action &A) { @@ -122,5 +121,4 @@ } } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/lib/LRGraph.cpp =================================================================== --- clang-tools-extra/pseudo/lib/LRGraph.cpp +++ clang-tools-extra/pseudo/lib/LRGraph.cpp @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#include "clang/Tooling/Syntax/Pseudo/LRGraph.h" -#include "clang/Tooling/Syntax/Pseudo/Grammar.h" +#include "clang-pseudo/LRGraph.h" +#include "clang-pseudo/Grammar.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/Hashing.h" #include "llvm/ADT/STLExtras.h" @@ -15,16 +15,16 @@ #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/raw_ostream.h" -using ItemSet = std::vector<clang::syntax::pseudo::Item>; +using ItemSet = std::vector<clang::pseudo::Item>; namespace llvm { -// Support clang::syntax::pseudo::Item as DenseMap keys. +// Support clang::pseudo::Item as DenseMap keys. template <> struct DenseMapInfo<ItemSet> { static inline ItemSet getEmptyKey() { - return {DenseMapInfo<clang::syntax::pseudo::Item>::getEmptyKey()}; + return {DenseMapInfo<clang::pseudo::Item>::getEmptyKey()}; } static inline ItemSet getTombstoneKey() { - return {DenseMapInfo<clang::syntax::pseudo::Item>::getTombstoneKey()}; + return {DenseMapInfo<clang::pseudo::Item>::getTombstoneKey()}; } static unsigned getHashValue(const ItemSet &I) { return llvm::hash_combine_range(I.begin(), I.end()); @@ -36,7 +36,6 @@ } // namespace llvm namespace clang { -namespace syntax { namespace pseudo { namespace { @@ -227,5 +226,4 @@ } } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/lib/GrammarBNF.cpp =================================================================== --- clang-tools-extra/pseudo/lib/GrammarBNF.cpp +++ clang-tools-extra/pseudo/lib/GrammarBNF.cpp @@ -6,15 +6,14 @@ // //===----------------------------------------------------------------------===// +#include "clang-pseudo/Grammar.h" #include "clang/Basic/TokenKinds.h" -#include "clang/Tooling/Syntax/Pseudo/Grammar.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/FormatVariadic.h" #include <memory> namespace clang { -namespace syntax { namespace pseudo { namespace { @@ -244,5 +243,4 @@ } } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/lib/Grammar.cpp =================================================================== --- clang-tools-extra/pseudo/lib/Grammar.cpp +++ clang-tools-extra/pseudo/lib/Grammar.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "clang/Tooling/Syntax/Pseudo/Grammar.h" +#include "clang-pseudo/Grammar.h" #include "clang/Basic/TokenKinds.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" @@ -15,7 +15,6 @@ #include "llvm/Support/raw_ostream.h" namespace clang { -namespace syntax { namespace pseudo { Rule::Rule(SymbolID Target, llvm::ArrayRef<SymbolID> Sequence) @@ -181,5 +180,4 @@ GrammarTable::GrammarTable() : Terminals(getTerminalNames()) {} } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/lib/DirectiveMap.cpp =================================================================== --- clang-tools-extra/pseudo/lib/DirectiveMap.cpp +++ clang-tools-extra/pseudo/lib/DirectiveMap.cpp @@ -6,13 +6,12 @@ // //===----------------------------------------------------------------------===// -#include "clang/Tooling/Syntax/Pseudo/DirectiveMap.h" +#include "clang-pseudo/DirectiveMap.h" #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/TokenKinds.h" #include "llvm/Support/FormatVariadic.h" namespace clang { -namespace syntax { namespace pseudo { namespace { @@ -151,8 +150,8 @@ } static void dump(llvm::raw_ostream &OS, const DirectiveMap &, unsigned Indent); -static void dump(llvm::raw_ostream &OS, const DirectiveMap::Directive &Directive, - unsigned Indent) { +static void dump(llvm::raw_ostream &OS, + const DirectiveMap::Directive &Directive, unsigned Indent) { OS.indent(Indent) << llvm::formatv("#{0} ({1} tokens)\n", tok::getPPKeywordSpelling(Directive.Kind), Directive.Tokens.size()); @@ -205,5 +204,4 @@ #undef OSTREAM_DUMP } // namespace pseudo -} // namespace syntax } // namespace clang Index: clang-tools-extra/pseudo/lib/CMakeLists.txt =================================================================== --- clang-tools-extra/pseudo/lib/CMakeLists.txt +++ clang-tools-extra/pseudo/lib/CMakeLists.txt @@ -1,6 +1,6 @@ set(LLVM_LINK_COMPONENTS Support) -add_clang_library(clangToolingSyntaxPseudo +add_clang_library(clangPseudo DirectiveMap.cpp Grammar.cpp GrammarBNF.cpp Index: clang-tools-extra/pseudo/include/clang-pseudo/Token.h =================================================================== --- clang-tools-extra/pseudo/include/clang-pseudo/Token.h +++ clang-tools-extra/pseudo/include/clang-pseudo/Token.h @@ -25,8 +25,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLING_SYNTAX_TOKEN_H -#define LLVM_CLANG_TOOLING_SYNTAX_TOKEN_H +#ifndef CLANG_PSEUDO_TOKEN_H +#define CLANG_PSEUDO_TOKEN_H #include "clang/Basic/LLVM.h" #include "clang/Basic/TokenKinds.h" @@ -39,7 +39,6 @@ namespace clang { class LangOptions; -namespace syntax { namespace pseudo { /// A single C++ or preprocessor token. @@ -199,7 +198,6 @@ TokenStream stripComments(const TokenStream &); } // namespace pseudo -} // namespace syntax } // namespace clang #endif Index: clang-tools-extra/pseudo/include/clang-pseudo/LRTable.h =================================================================== --- clang-tools-extra/pseudo/include/clang-pseudo/LRTable.h +++ clang-tools-extra/pseudo/include/clang-pseudo/LRTable.h @@ -34,16 +34,15 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLING_SYNTAX_PSEUDO_LRTABLE_H -#define LLVM_CLANG_TOOLING_SYNTAX_PSEUDO_LRTABLE_H +#ifndef CLANG_PSEUDO_LRTABLE_H +#define CLANG_PSEUDO_LRTABLE_H -#include "clang/Tooling/Syntax/Pseudo/Grammar.h" +#include "clang-pseudo/Grammar.h" #include "llvm/ADT/ArrayRef.h" #include <cstdint> #include <vector> namespace clang { -namespace syntax { namespace pseudo { // Represents the LR parsing table, which can efficiently the question "what is @@ -176,7 +175,6 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &, const LRTable::Action &); } // namespace pseudo -} // namespace syntax } // namespace clang #endif // LLVM_CLANG_TOOLING_SYNTAX_PSEUDO_LRTABLE_H Index: clang-tools-extra/pseudo/include/clang-pseudo/LRGraph.h =================================================================== --- clang-tools-extra/pseudo/include/clang-pseudo/LRGraph.h +++ clang-tools-extra/pseudo/include/clang-pseudo/LRGraph.h @@ -28,15 +28,14 @@ // in making decisions. //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLING_SYNTAX_PSEUDO_LRGRAPH_H -#define LLVM_CLANG_TOOLING_SYNTAX_PSEUDO_LRGRAPH_H +#ifndef CLANG_PSEUDO_LRGRAPH_H +#define CLANG_PSEUDO_LRGRAPH_H -#include "clang/Tooling/Syntax/Pseudo/Grammar.h" +#include "clang-pseudo/Grammar.h" #include "llvm/ADT/Hashing.h" #include <vector> namespace clang { -namespace syntax { namespace pseudo { // An LR item -- a grammar rule with a dot at some position of the body. @@ -152,23 +151,22 @@ }; } // namespace pseudo -} // namespace syntax } // namespace clang namespace llvm { -// Support clang::syntax::pseudo::Item as DenseMap keys. -template <> struct DenseMapInfo<clang::syntax::pseudo::Item> { - static inline clang::syntax::pseudo::Item getEmptyKey() { - return clang::syntax::pseudo::Item::sentinel(-1); +// Support clang::pseudo::Item as DenseMap keys. +template <> struct DenseMapInfo<clang::pseudo::Item> { + static inline clang::pseudo::Item getEmptyKey() { + return clang::pseudo::Item::sentinel(-1); } - static inline clang::syntax::pseudo::Item getTombstoneKey() { - return clang::syntax::pseudo::Item::sentinel(-2); + static inline clang::pseudo::Item getTombstoneKey() { + return clang::pseudo::Item::sentinel(-2); } - static unsigned getHashValue(const clang::syntax::pseudo::Item &I) { + static unsigned getHashValue(const clang::pseudo::Item &I) { return hash_value(I); } - static bool isEqual(const clang::syntax::pseudo::Item &LHS, - const clang::syntax::pseudo::Item &RHS) { + static bool isEqual(const clang::pseudo::Item &LHS, + const clang::pseudo::Item &RHS) { return LHS == RHS; } }; Index: clang-tools-extra/pseudo/include/clang-pseudo/Grammar.h =================================================================== --- clang-tools-extra/pseudo/include/clang-pseudo/Grammar.h +++ clang-tools-extra/pseudo/include/clang-pseudo/Grammar.h @@ -33,8 +33,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLING_SYNTAX_GRAMMAR_H -#define LLVM_CLANG_TOOLING_SYNTAX_GRAMMAR_H +#ifndef CLANG_PSEUDO_GRAMMAR_H +#define CLANG_PSEUDO_GRAMMAR_H #include "clang/Basic/TokenKinds.h" #include "llvm/ADT/ArrayRef.h" @@ -44,7 +44,6 @@ #include <vector> namespace clang { -namespace syntax { namespace pseudo { // A SymbolID uniquely identifies a terminal/non-terminal symbol in a grammar. // Non-terminal IDs are indexes into a table of non-terminal symbols. @@ -178,7 +177,6 @@ }; } // namespace pseudo -} // namespace syntax } // namespace clang #endif // LLVM_CLANG_TOOLING_SYNTAX_GRAMMAR_H Index: clang-tools-extra/pseudo/include/clang-pseudo/DirectiveMap.h =================================================================== --- clang-tools-extra/pseudo/include/clang-pseudo/DirectiveMap.h +++ clang-tools-extra/pseudo/include/clang-pseudo/DirectiveMap.h @@ -25,16 +25,15 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLING_SYNTAX_PREPROCESS_H -#define LLVM_CLANG_TOOLING_SYNTAX_PREPROCESS_H +#ifndef CLANG_PSEUDO_DIRECTIVEMAP_H +#define CLANG_PSEUDO_DIRECTIVEMAP_H +#include "clang-pseudo/Token.h" #include "clang/Basic/TokenKinds.h" -#include "clang/Tooling/Syntax/Pseudo/Token.h" #include <vector> namespace clang { class LangOptions; -namespace syntax { namespace pseudo { /// Describes the structure of a source file, as seen by the preprocessor. @@ -142,7 +141,6 @@ }; } // namespace pseudo -} // namespace syntax } // namespace clang #endif Index: clang/lib/Tooling/Syntax/Pseudo/README.md =================================================================== --- /dev/null +++ clang/lib/Tooling/Syntax/Pseudo/README.md @@ -1,37 +0,0 @@ -# clang pseudoparser - -This directory implements an approximate heuristic parser for C++, based on the -clang lexer, the C++ grammar, and the GLR parsing algorithm. - -It parses a file in isolation, without reading its included headers. -The result is a strict syntactic tree whose structure follows the C++ grammar. -There is no semantic analysis, apart from guesses to disambiguate the parse. -Disambiguation can optionally be guided by an AST or a symbol index. - -For now, the best reference on intended scope is the [design proposal], -with further discussion on the [RFC]. - -## Dependencies between pseudoparser and clang - -Dependencies are limited because they don't make sense, but also to avoid -placing a burden on clang mantainers. - -The pseudoparser reuses the clang lexer (clangLex and clangBasic libraries) but -not the higher-level libraries (Parse, Sema, AST, Frontend...). - -When the pseudoparser should be used together with an AST (e.g. to guide -disambiguation), this is a separate "bridge" library that depends on both. - -Clang does not depend on the pseudoparser at all. If this seems useful in future -it should be discussed by RFC. - -## Parity between pseudoparser and clang - -The pseudoparser aims to understand real-world code, and particularly the -languages and extensions supported by Clang. - -However we don't try to keep these in lockstep: there's no expectation that -Clang parser changes are accompanied by pseudoparser changes or vice versa. - -[design proposal]: https://docs.google.com/document/d/1eGkTOsFja63wsv8v0vd5JdoTonj-NlN3ujGF0T7xDbM/edit -[RFC]: https://discourse.llvm.org/t/rfc-a-c-pseudo-parser-for-tooling/59217/49 Index: clang-tools-extra/pseudo/CMakeLists.txt =================================================================== --- /dev/null +++ clang-tools-extra/pseudo/CMakeLists.txt @@ -0,0 +1,6 @@ +include_directories(include) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) +add_subdirectory(lib) +add_subdirectory(tool) +add_subdirectory(unittests) +add_subdirectory(test) Index: clang-tools-extra/CMakeLists.txt =================================================================== --- clang-tools-extra/CMakeLists.txt +++ clang-tools-extra/CMakeLists.txt @@ -15,6 +15,7 @@ add_subdirectory(clang-move) add_subdirectory(clang-query) add_subdirectory(pp-trace) +add_subdirectory(pseudo) add_subdirectory(tool-template) # Add the common testsuite after all the tools.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits