【问题标题】:Regular expressions representing BNF表示 BNF 的正则表达式
【发布时间】:2021-11-27 17:33:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: regex compiler-construction jflex


    【解决方案1】:

    查看 BNF,我们可以看到 &lt;id&gt; 可以以字母或下划线开头。我们还可以看到&lt;id&gt; 后面可以跟一个数字或字母,它仍然是一个有效的&lt;id&gt;。这意味着&lt;id&gt; 以字母或下划线开头,后面可以跟 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])*
    

    【讨论】:

    • JFlex 并不坚持使用宏。它还提供了预定义的字符类 [:jletter:][:jletterdigit:],尽管它们可能不是正在寻找的,因为它们包含其他 Unicode 字母。
    • @rici 我知道并且不会在[:jletter:] 中也包含下划线?
    • 感谢您的帮助。我对另外两个规则感到困惑:任何字符,正常转义\n,\t,\',\"和注释以“#”开头并延伸到行尾。你能帮忙吗?好吗?
    • 首先,请参阅What should I do when someone answers my question?。然后发布另一个问题,确保清楚您需要什么。你不能问多部分的问题,也不应该继续在已经回答的问题上附加额外的问题(希望是令人满意的)。当您发布新问题时。您可以通过指向新问题的链接发布对此答案的新评论。谢谢。
    • 是的,它与原始问题相关,因为它是一个 JLex 问题。但这是一个新的 JLex 问题。
    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2015-12-29
    • 1970-01-01
    相关资源
    最近更新 更多