用Python解析Golang源文件

在给ulipad代码编辑器做一个支持Golang的plugin,这个文件是plugin所需的mClassBrowser.py文件的一部分

GolangParse.py

import re

def parseFile(filename):
    dict = {‘import‘:[], ‘struct‘:{}, ‘func‘:[]}

    in_import = False

    lines = open(filename).readlines()

    for linen in range(0, len(lines)):
        line = lines[linen].lstrip()

        match = re.match(r‘import\s+(\w*\s*)"(\w+)"‘, line)
        if match != None:
            dict[‘import‘].append((match.groups()[-1], linen))
        elif re.match(r‘import\s+\(‘, line) != None:
            in_import = True
        elif in_import:
            match = re.match(r‘(\w*\s*)"(\w+)"‘, line)
            if match != None:
                dict[‘import‘].append((match.groups()[-1], linen))
            elif re.match(r‘\)‘, line):
                in_import = False
        else:
            match = re.match(r‘type\s+(\w+)\s+struct‘, line)
            if match != None:
                dict[‘struct‘][match.groups()[-1]] = {‘linen‘:linen, ‘method‘:[]}
            else:
                match = re.match(r‘func\s+(\w+)\(.*\)‘, line)
                if match != None:
                    dict[‘func‘].append((match.groups()[-1], linen))
                else:
                    match = re.match(r‘func\s+\(\w+\s+\*(\w+)\)\s+(\w+)\(.*\)‘, line)
                    if match != None:
                        dict[‘struct‘][match.groups()[0]][‘method‘].append((match.groups()[-1], linen))

    return dict

if __name__ == "__main__":
    dict = parseFile(‘test.go‘)
    print ‘----- import -----‘
    for name, linen in dict[‘import‘]:
        print name, linen
    print ‘----- struct -----‘
    for name in dict[‘struct‘]:
        print name, dict[‘struct‘][name][‘linen‘]
        print ‘\t‘, ‘----- method -----‘
        for name, linen in dict[‘struct‘][name][‘method‘]:
            print ‘\t‘, name, linen
    print ‘------ func ------‘
    for name, linen in dict[‘func‘]:
        print name, linen

被解析文件test.go

package main

import "fmt"
import "sex"

import (
    "log"
    "time"
)

type Person struct {
    Name string
    Age  uint
    Sex  sex.Sex
}

func (self *Person) SayHi() {
    fmt.Printf("Hi from %T\n", *self)
}

func (self *Person) SayHello() {
    fmt.Printf("Hello from %T\n", *self)
}

type Student struct {
    Person
    School string
}

func (self *Student) SayHello() {
    fmt.Printf("Hello from %T\n", *self)
}

func main() {
    lucy := Student{Person: Person{Name: "Lucy", Age: 15, Sex: sex.Female},
        School: "Beijing Primary School"}
    fmt.Printf("Age    of %s: %v\n", lucy.Name, lucy.Age)
    fmt.Printf("Sex    of %s: %v\n", lucy.Name, lucy.Sex)
    fmt.Printf("School of %s: %v\n", lucy.Name, lucy.School)

    lucy.SayHi()
    lucy.SayHello()
    lucy.Person.SayHello()
}

输出结果

时间: 2024-10-10 15:05:03

用Python解析Golang源文件的相关文章

# 深入浅出爬虫之道: Python、Golang与GraphQuery的对比

深入浅出爬虫之道: Python.Golang与GraphQuery的对比 本文将分别使用 Python ,Golang 以及 GraphQuery 来解析某网站的 素材详情页面 ,这个页面的特色是具有清晰的数据结构,但是DOM结构不够规范,无法通过单独的选择器定位页面元素,对页面的解析造成了一些曲折.通过这个页面的解析过程,深入浅出的了解爬虫的解析思想与这些语言之间的异同. 深入浅出爬虫之道: Python.Golang与GraphQuery的对比 一.前言 1. 语义化的DOM结构 2. 稳

python解析json文件

概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象. JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集. Python2.6开始加入了JSON模块,无需另外下载,Python的Json模

python解析json

认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等).这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. 引用模块

python 解析docx文档的方法,以及提取插入的文本对象和图片

首先安装docx模块,通过pip install docx或者在docx官方链接上下载安装都可以 下面来看下如何解析docx文档:文档格式如下 有3个部分组成 1 正文:text文档 2 一个表格. 3一个插入的文件对象.4 一个图片 这4个部分是我们在docx文档中最常见的几种格式.解析代码如下 import docx def docx_try():     doc=docx.Document(r'E:\py_prj\test.docx')     for p in doc.paragraph

python 解析命令行

原文 http://python.jobbole.com/87014 python解析命令行 2016/12/13 · 基础知识 · 命令行 分享到:0 原文出处: 顾慎为 getopt:和C中的getopt()等价.optparse:2.7后已不推荐使用.argparse:基于optparse的新库.docopt:根据文档描述,自动生成.另一份参考文档:docopt. 更详细的内容可参考上述文档. getopt 若对C的getopt()函数不熟悉,或者倾向于使用较少的代码,或者需要对帮助信息和

Python解析HDF文件

前段时间因为一个业务的需求需要解析一个HDF格式的文件.在这之前也不知道到底什么是HDF文件.百度百科的解释如下: HDF是用于存储和分发科学数据的一种自我描述.多对象文件格式.HDF是由美国国家超级计算应用中心NCSA(全称:National Center for Supercomputing Application)创建的,为了满足各种领域研究需求而研制的一种能高效存储和分发科学数据的新型数据格式.HDF可以表示出科学数据存储和分布的许多必要条件. 使用Python解析当然会用到第三方的包,

python解析xml文件操作的例子

python解析xml文件操作实例,操作XML文件的常见技巧. xml文件内容: <?xml version="1.0" ?> <!--Simple xml document__chapter 8--> <book> <title> sample xml thing </title> <author> <name> <first> ma </first> <last>

python解析RSS(feedparser)

虽然说当今的博客已经不像前几年那么火了,但是RSS还是一项很有创造性和实用性的东西.RSS 是用于分发 Web 站点上的内容的摘要的一种简单的 XML 格式.它能够用于共享各种各样的信息.关于RSS的详细信息在(http://www.rssboard.org/rss-profile),这里面详细的讲了各种值的含义(虽然各个版本的支持不太一样,但是还是比较有通用性的).这里我先介绍一下怎么使用feedparser操作RSS然后再介绍一些常用的属性,也方便大家实验:一.feedparser的安装首先

Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试

摘要:由于近期打算修改Python解释器以实现pyc文件的加密/解密,出于保密的要求,解密之后的数据只能放在内存中,不能写入到文件中.但是后续的解析pyc文件的代码又只能接受FILE*作为入参,所以就提出了一种把通过FILE*来访问内存的需求,下文是针对这个需求的几个方面的尝试及其结论. 以下尝试的前提是:Win7 + VS2010. 在vc中,FILE其实就是_iobuf,定义如下: struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前