Hi Arthur,
Le 8 juin 2022 à 19:07, slipbits <h...@slipbits.com> a écrit :
In 3.4.6 Actions the format of a name, as in RULE[name], not mentioned nor is
the scope of the name, nor any constraint. For purposes of this discussion we
define EBNF tag as the RULE name.
This is wrong. First, it's not about rules, but about symbols (tokens and nonterminals)
in rules. Second, Bison is not about *E*BNF at all, and its notation for grammar is not
BNF either. They are called "named reference" in Bison, let's keep that name.
They are described in 3.6 (and 3.4.6 does point to 3.6).
One should s/EBNF tag/reference name/g in your message.
Am I correct in assuming that:
1. A EBNF tag is composed of alphabetic, numeric characters and a dash
('-') and underscore, ('_').
And period. They follow the same pattern as symbol names, defined in 3.2.
2. The format of a EBNF tagis ([a-zA-Z] | (-|_)+)([a-zA-Z]|'-'|'_'_)*.
Embedded white space is not allowed.
This is wrong. Have a look at Bison's scangram.l.
letter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
id {letter}({letter}|[-0-9])*
3. EBNF tags are case sensitive. Name and name are different.
4. EBNF tags can be used for terminals and non-terminals. For
* expr : expr '+' expr
expr[tag2] : exprtag2] '+'[tag3] expr[tag4] is legal
FWIW, in the context of GNU projects, we avoid "legal" and prefer "valid". Let's keep
"legal" for justice.
5. EBNF tags can only be used in a block statement (brace block).
expr[name] : name + expr is not legal,
I don't understand what you call a block statement in the context of Bison.
expr[name] : name '+' expr
is valid, independently of whether there's an action afterwards.
6. Within a block statement, EBNF tag are referenced by '$'tag or
'@'tag. That is, LHS[name] is referenced by $name or @name.
* The '$' prefix refers to the terminal/non-terminal value
(semantics).
* The '@' prefix refers to the location of the
terminal/non-terminal. (see 1.6 Location).
7. The scope of a EBNF tag is the EBNF expression it is in, with the
following conditions:
* LHS[name] : RHS // is a scope
* LHS[name] | RHS // is a scope
"LHS[name] | RHS" is a syntax error, but I understand what you mean: yes when
an lhs is provided with a reference name, then all its RHSes see that reference name.
8. EBNF tags are unique within their scope.
* LHS[name] : RHS[name] // is not legal
* LHS : R1[name] R2[name] // is not legal
9. EBNF tags declared in the EBNF statement do not hide names within
the scope of the block statement.For example:
<type> name; // in global scope
o o o
LHS[name] : RHS { $name = name;} is legal
I don't see were the last "name" is defined (it will not be related to your "<type>
name"). But for Bison, this is fine, yes.
10. EBNF tags and terminal/non-terminal names can be the same. That is:
* expr[expr] : expr '+' expr is legal
11. The scope of the LHS EBNF tag is the entire expression. That is in
LHS[name] : RHS1 {$name = }
| RHS2 {$name = }
both refer the the LHS EBNF tag, name.
12. yy and YY have special meanings within Bison and should not be used
as EBNF tag prefixes. That is yyname and YYname are both legal but
should not be used.
Given that reference names are used only during parser generation and do not
exist in the generated parsers, you don't have such constraints.
13. "__" should not be used in C/C++ block statements. Both C and C++
standards and compilers use these prefixes.
Irrelevant to Bison.
14. Where one blank is legal, many can be used. The following is legal:
* LHS [ name ] and
* LHS[name ] and
* LHS[ name] and so on for the RHS.
15. A "EBNF tag block" is defined as EBNF[name], where [name] is a "EBNF
tag block". Only one name is allowed in a EBNF tag block. That is
LHS[name1 name2] is not legal
16. The LHS EBNF tag has no value on rule reduction and must be assigned
a value (lvalue). After assignment it can be used as an rvalue.
* LHS[name] : ... { $name = value; ...} // is legal
* LHS[name]: ... { var = $name; .. } // is not legal
* LHS[name]: ... { $name = value; ... var = $name; ... ) // is legal
Unrelated to named references (it's the same for $$, $1, etc.), and actually somewhat
false. Depending on the skeleton, $$ = $1 may have been run before executing the user
action. So "using" $$ before assigning to it may be valid.
17. The RHS EBNF tag has a value on rule reduction.
Unrelated.
18. The EBNF tag for the LHS and RHS have a location on rule reduction.
Unrelated.
19. If the tagged terminal/non-terminal is a structure or class, then
it's public members can be accessed by using a '.',. if the EBNF
tag is name, then for example,
* if it has a value (semantic) as in
struct {
int x;
int y;
}
then name.x refers to the x component of the structure.
name.x denotes nothing at all for Bison. $[name].x and $name.x do, and mean
the same. However $[name.x] uses 'name.x' has identifier.
* if it is a location then name.first_column refers to a value in
the location structure.
You mean @mame.first_column. And yes, it does.
Definition:
LHS left hand size LHS : RHS
RHS right hand side LHS : RHS
Are these assumptions correct.
Most statements are true, except the ones I answered to. I will add the
following patch to the documentation to clarify fuzzy bits. Thanks for the
report!
Cheers!
commit 15b97a0a6ab49a148cdfbe7d06d12b2624a33f97
Author: Akim Demaille <akim.demai...@gmail.com>
Date: Mon Sep 12 07:18:15 2022 +0200
doc: define the syntax of named references
Reported by Arthur Schwarz.
https://lists.gnu.org/r/help-bison/2022-06/msg00007.html
* doc/bison.texi (Named References): Define the syntax of named
references.
diff --git a/doc/bison.texi b/doc/bison.texi
index a4bc037e..b2eddcf8 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -5024,7 +5024,12 @@ @node Named References
@end group
@end example
-@noindent
+Like symbol names (@pxref{Symbols}), reference names can contain letters,
+underscores, periods, and non-initial digits and dashes. In bracketed
+reference names, leading and trailing blanks and comments are ignored:
+@samp{[ name ]} and @samp{[/* A */ name /* for references. */]} are
+equivalent to @samp{[name]}.
+
In order to access a semantic value generated by a midrule action, an
explicit name may also be declared by putting a bracketed name after the
closing brace of the midrule action code: