yacc中的EBNF分组是什么

What is the EBNF grouping in yacc

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

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

有什么方法可以这样分组吗?

yacc 不支持EBNF,所以需要将EBNF 操作符转换为简单的BNF 才能在yacc 中使用。一般来说,每个这样的运营商都需要引入一个新的符号。所以

[...] 变成 <new-symbol>

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

{...} 变成 <new-symbol> with1

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

(...) 变成 <new-symbo>

<new-symbol> ::= ...

1如果...中有任何|运算符,则需要在每个运算符后插入<new-symbol>替换