表示 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]*
[a-zA-Z_]
匹配字母或'_'
[0-9a-zA-Z]*
匹配数字或字母 0 次或多次。
但由于您已经将 {digit} 和 {letter} 定义为单个字符 类,这将使用 JFlex(我对 JFlex 不太熟悉,所以我可能没有 JFlex 语法完全正确):
id = ({letter}|_)({digit}|{letter})*
这相当于正则表达式:
([a-zA-Z]|_)([0-9]|[a-zA-Z])*
我正在研究词法分析器。我需要识别 BNF 中的模式并使用正则表达式指定它们。我知道有令牌,例如关键字、标识符、运算符等。到目前为止,我已经定义了正则表达式:
digit=[0-9]
integer={digit}+
letter=[a-zA-Z]
但是标识符的给定 BNF 规则是:
< id > ::= < letter >
| "_"
| < id > < digit >
| < id > < letter >
由于 id={letter}+|"_"|{id}{digit}+
用于上述 BNF 规则,但它给我错误,Regular expression contains cycle.
查看 BNF 我们可以看到 <id>
可以以字母或下划线开头。我们还可以看到 <id>
后面可以跟数字或字母,它仍然是有效的 <id>
。这意味着 <id>
以字母或下划线开头,后面可以跟 0 个或更多数字或字母。这表明以下正则表达式:
id = [a-zA-Z_][0-9a-zA-Z]*
[a-zA-Z_]
匹配字母或'_'[0-9a-zA-Z]*
匹配数字或字母 0 次或多次。
但由于您已经将 {digit} 和 {letter} 定义为单个字符 类,这将使用 JFlex(我对 JFlex 不太熟悉,所以我可能没有 JFlex 语法完全正确):
id = ({letter}|_)({digit}|{letter})*
这相当于正则表达式:
([a-zA-Z]|_)([0-9]|[a-zA-Z])*