表示 BNF 的正则表达式

Regular expressions representing BNF

我正在研究词法分析器。我需要识别 BNF 中的模式并使用正则表达式指定它们。我知道有令牌,例如关键字、标识符、运算符等。到目前为止,我已经定义了正则表达式:

 digit=[0-9]
    integer={digit}+
    letter=[a-zA-Z]

但是标识符的给定 BNF 规则是:

   < id > ::= < letter >
                | "_"
                | < id > < digit >
                | < id > < letter >

由于 是由递归模式定义的,我该如何使用正则表达式来表达这种模式。 我尝试了这个 Regular expression: id={letter}+|"_"|{id}{digit}+ 用于上述 BNF 规则,但它给我错误,Regular expression contains cycle.

查看 BNF 我们可以看到 <id> 可以以字母或下划线开头。我们还可以看到 <id> 后面可以跟数字或字母,它仍然是有效的 <id>。这意味着 <id> 以字母或下划线开头,后面可以跟 0 个或更多数字或字母。这表明以下正则表达式:

id = [a-zA-Z_][0-9a-zA-Z]*
  1. [a-zA-Z_] 匹配字母或'_'
  2. [0-9a-zA-Z]* 匹配数字或字母 0 次或多次。

但由于您已经将 {digit} 和 {letter} 定义为单个字符 类,这将使用 JFlex(我对 JFlex 不太熟悉,所以我可能没有 JFlex 语法完全正确):

id = ({letter}|_)({digit}|{letter})*

这相当于正则表达式:

([a-zA-Z]|_)([0-9]|[a-zA-Z])*