Bison yacc中的EBNF分组是什么
我正在用lex/yacc编写程序语法。我有一个关于语法歧义的问题,我需要看看EBNF语法。当我搜索yacc及其声明的语义时,我看到了分组({…}),但我不知道如何初始化它。例如,选项([…])用|初始化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
%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
这样的分组才起作用。