[PATCH] D129222: [pseudo] Implement a guard to determine function declarator.
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 7 10:30:56 PDT 2022
sammccall added inline comments.
================
Comment at: clang-tools-extra/pseudo/gen/Main.cpp:114
+ const clang::pseudo::Rule &R = G.table().Rules[RID];
+ // lhs$$rhs$rhs$rhs
+ std::string EnumName = symbolName(R.Target, G) + "$";
----------------
so the dollar signs are a practical problem: at least on my machine the warning is on by default, so we emit thousands of warnings and it's impossible to find the error among them.
At *minimum* we need to use pragmas or something to suppress the warning.
But using nonstandard C++ seems likely to cause other problems and limit portability for not-great reasons.
Some ideas:
-`Rule::ptr_declarator__EQUALS__ptr_operator__ptr_declarator` (this violates the internal `__` rule, though that one is widely ignored)
- `Rule::ptr_declarator_0ptr_operator_1ptr_declarator`
- `Rule::PtrDeclarator_EQ_PtrOperator_PtrDeclarator` (yet another spelling variation, but quite readable. We could even change the spellings in the BNF file...)
================
Comment at: clang-tools-extra/pseudo/include/clang-pseudo/Language.h:29
// Return true if the guard is satisfied.
using RuleGuard = llvm::function_ref<bool(
+ RuleID RID, llvm::ArrayRef<const ForestNode *> RHS, const TokenStream &)>;
----------------
sammccall wrote:
> This allows/encourages guards that dynamically consider multiple rules, which increases the amount of coupling between rules and grammar.
>
> Can we express this as
> function-declarator := declarator [guard=FunctionDeclarator]?
>
> This does mangle the grammar a bit to our implementation, and introduces two names for the same concept (guard & nonterminal).
> If this feels ugly and redundant, another option would be to change the guard to be specified by the rule ID instead of an extension ID:
> ```
> function-declarator := declarator [guard]
>
> DenseMap<RuleID, RuleGuard> Guards;
> ```
Having played with this idea a bit, I do think we should strongly consider dispatching on the rule ID rather than a named extension. I went to add some more guards (on NUMERIC_CONSTANT etc) and they really are 1:1 with rules.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D129222/new/
https://reviews.llvm.org/D129222
More information about the cfe-commits
mailing list