Bison yacc中的EBNF分组是什么

Bison yacc中的EBNF分组是什么,bison,flex-lexer,yacc,ebnf,Bison,Flex Lexer,Yacc,Ebnf,我正在用lex/yacc编写程序语法。我有一个关于语法歧义的问题,我需要看看EBNF语法。当我搜索yacc及其声明的语义时,我看到了分组({…}),但我不知道如何初始化它。例如,选项([…])用|初始化 %token PROGRAM ID SEMICOLON program: PROGRAM ID SEMICOLON | PROGRAM ‘,’ ID SEMICOLON 有没有这样的分组方法 yacc不支持EBNF,因此需要将EBN

我正在用lex/yacc编写程序语法。我有一个关于语法歧义的问题,我需要看看EBNF语法。当我搜索yacc及其声明的语义时,我看到了分组({…}),但我不知道如何初始化它。例如,选项([…])用|初始化

%token PROGRAM ID SEMICOLON
    program: 
             PROGRAM ID SEMICOLON
             | PROGRAM ‘,’ ID SEMICOLON

有没有这样的分组方法

yacc不支持EBNF,因此需要将EBNF运算符转换为简单BNF,以便在yacc中使用。通常,每个这样的操作符都需要引入一个新符号。所以

[
..
]
变成了

<new-symbol> ::= ε | ...
<new-symbol> ::= ...
变为

<new-symbol> ::= ε | ...
<new-symbol> ::= ...
:=。。。


1如果在…中有任何
运算符,则需要在此替换中的每个运算符之后插入

{…}
是语义操作,而不是分组。Yacc不做EBNF。@我知道,但我想知道如何将EBNF中的分组初始化为Yacc。我不明白“初始化分组”是什么意思。Yacc没有分组运算符。@rici我指的是实现,例如,在现实生活中,您可以用节点绘制二叉树,但它在java或c中的实现不同。当您说“分组”时,是指重复(在许多EBNF语法中使用大括号编写)?因为分组(即大多数语法中的简单括号)在没有另一个操作符参与的情况下不能做任何事情。像
A(bc)D
一样,也可以像
A B C D
一样编写。只有像
A(B | C)D
这样的分组才起作用。