liangxiaowen

利用递归匹配寻找函数体

  •  
  •   liangxiaowen · Aug 27, 2019 · 4243 views
    This topic created in 2456 days ago, the information mentioned may be changed or developed.

    背景

    我在尝试利用 python 正则表达式解析 java 文件。

    目前遇到的问题

    因为函数体中可能出现多重{},因此采用 python 的 regex。 regex.findall(r'{(?>[^{}]|(?R))}',java_file)

        public void fun(int n) {
            if(n > 1) {
                if (n == 2) {
                  n = 3;  
                }
            }
        }
    

    确实能匹配到

     {
            if(n > 1) {
                if (n == 2) {
                  n = 3;  
                }
            }
        }
    

    可我需要前面的public 和函数名fun。 在使用 public.*?{(?>[^{}]|(?R))}时,没能匹配到。

    甚至使用 public{(?>[^{}]|(?R))}去匹配

        public{
            ...
        }
    

    仍然不能匹配到。

    在递归匹配式前后加东西如何实现 我对递归匹配不是很熟悉,希望***指点一下***。

    8 replies    2019-08-28 10:48:50 +08:00
    thedrwu
        1
    thedrwu  
       Aug 27, 2019 via Android
    regex 从简单的慢慢调。
    然而上下文无关的语法已经超出了正则的表达,加上递归也是有限的(比如注释里、字符串里有不对称的括号)。
    momocraft
        2
    momocraft  
       Aug 27, 2019
    对自己好一点 学点形式语言的知识吧
    Buges
        3
    Buges  
       Aug 27, 2019 via Android
    我想到的思路就是,既然你解析 java 源文件,那就像 java 一样解析。
    比如先把注释忽略,执行转义,提取字符串等等。
    实在不行就去看看 jdk 源码里对语意是如何处理的。
    liangxiaowen
        4
    liangxiaowen  
    OP
       Aug 27, 2019
    @thedrwu 注释已经有工具解决了。
    GeruzoniAnsasu
        5
    GeruzoniAnsasu  
       Aug 27, 2019 via Android
    用正则去匹配编程语言的结构明显是编译原理完全没看过的思路

    建议从递归下降这个词开始搜
    liangxiaowen
        6
    liangxiaowen  
    OP
       Aug 27, 2019
    语法树的分析应该更适合我,虽然会比正则匹配更复杂。
    ipwx
        7
    ipwx  
       Aug 27, 2019 via Android
    请使用 pyparsing 这个库,而且 Java 很可能有 user contributed example
    aguesuka
        8
    aguesuka  
       Aug 28, 2019 via Android
    上下文无关法则可以表达正则不能表达的语法。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1010 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 19:24 · PVG 03:24 · LAX 12:24 · JFK 15:24
    ♥ Do have faith in what you're doing.