1

我正在尝试将 EBNF 文件转换为适用于 IntelliJ Grammar-kit 的 BNF。

在 EBNF 中有这样的规则:

BinOpChar ::= "~" | "!" | "@" | "#" | "$" | "%" | "^" | "&" | "*" | "-"
BinOp ::= BinOpChar, {BinOpChar}

如何在不使用正则表达式的情况下创建这样的规则?原因是这种构造经常发生,并且在正则表达式中变得重复。

需要明确的是,我希望能够创建一个匹配@@fromBinOpChar但不匹配的规则@ @。那可能吗?

4

1 回答 1

1

最简单的方法是独立列出每个运算符:

{
  tokens=[
    //...
    op_1='~'
    op_2='!'
    op_3='@'
    op_4='@@'
    op_5='#'
    //...
  ]
}

如果您真的想接受所有 n + n^2 标记,则需要使用正则表达式:

{
  tokens=[
    //...
    bin_op:'regexp:[~!@#]{1,2}'
    //...
  ]
}

但是想法是,您想使用词法分析器来定义标记,并使用语法来定义表达式等等。所以在语法中,如果你写:

{
  tokens=[
    space='regexp:\s+'
  ]
}

BinOp ::= BinOpChar [BinOpChar]
BinOpChar ::= "~" | "!" | "@" | "#"

然后它会接受@@and @ @。那有意义吗?

于 2016-01-19T22:46:14.383 回答