⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pybrowser.l

📁 这是一个Linux下的集成开发环境
💻 L
字号:
/* -*- c -*- *//*Copyright (c) 2000, Red Hat, Inc.This file is part of Source-Navigator.Source-Navigator is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public License as publishedby the Free Software Foundation; either version 2, or (at your option)any later version.Source-Navigator is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNUGeneral Public License for more details.You should have received a copy of the GNU General Public License alongwith Source-Navigator; see the file COPYING.  If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330, Boston,MA 02111-1307, USA.*/%{/* * pybrowser.l * * Written by Thomas Heller <thomas.heller@ion-tof.com> * * Description: * A lex specification for a scanner to parse python source code files * and store relevant information into the Source-Navigator project database. */#include <ctype.h>#include "lexinput.h"#include "tcl.h"#include "snptools.h"static char group[] = "python";static char *mystrdup(char *);static void var_or_const(int);static struct stack *scope_stack;static void push(int, int, char *);static void pop(int);static char *top(int *);static int calc_indent (char*, char *);static void baseclasses (char *, char *);static void parse_triple(int);#undef YY_INPUT#define YY_SKIP_YYWRAP#define YY_INPUT(buf,r,ms) (r = sn_encoded_input(buf, ms))intyywrap(){   return(1);}   %}%%\"\"\" {    sn_advance_column (3);    parse_triple((int)'"');}\'\'\' {    sn_advance_column (3);    parse_triple((int)'\'');}^[ \t]*def[ \t]+[a-zA-Z_][a-zA-Z_0-9]*[ \t]*\( {    int ofs;    char *p;    int indent;    char *classname;    int code;    int context;    /* point just before the '(', then go backwards to find and mark       the end of the name */    p = yytext + yyleng - 1;    while ((p[-1] == ' ') || (p[-1] == '\t'))	--p;    *p = '\0';    /* now go backwards to find the beginning */    p = yytext + yyleng-1;    while ((p > yytext) && (p[-1] != ' ') && (p[-1] != '\t'))	--p;    ofs = p - yytext;    indent = calc_indent (yytext, p);    pop(indent);    classname = top(&context);    if (classname) {	switch (context) {	case SN_CLASS_DEF:	    code = SN_MBR_FUNC_DEF;	    break;	default:	    code = SN_FUNC_DEF;	    classname = NULL;	    break;	}    } else	code = SN_FUNC_DEF;    push(indent, code, p);    sn_insert_symbol(code, classname, p, sn_current_file(),		     sn_line(), sn_column()+ofs, sn_line(), 		     sn_column()+ofs + strlen(p),		     0, NULL, NULL, NULL, NULL,		     sn_line(), sn_column()+ofs, sn_line(),		     sn_column()+ofs + strlen(p));}  ^[ \t]*class[ \t]+[a-zA-Z_][a-zA-Z_0-9]*[ \t]*(\([^)]*\))?[ \t]*: {    int ofs;    char *p, *super;    int indent;    char *end;    yytext[yyleng] = '\0';    p = yytext;    while (isspace (*p))        ++p;    indent = calc_indent (yytext, p);    p += strlen ("class");    while (isspace (*p))        ++p;    ofs = p - yytext;    end = p;    while (*end && (isalnum (*end) || (*end == '_')))        ++end;    *end = '\0';    pop(indent);    push(indent, SN_CLASS_DEF, p);    sn_insert_symbol(SN_CLASS_DEF, NULL, p, sn_current_file(),		     sn_line(), sn_column()+ofs, sn_line(), 		     sn_column()+ofs + strlen(p),		     0, NULL, NULL, NULL, NULL,		     sn_line(), sn_column()+ofs, sn_line(),		     sn_column()+ofs + strlen(p));    ++end;    super = end;    while ((end < yytext+yyleng) && *end) {	if (*end == '\n') {            sn_advance_line();            sn_reset_column();	}        ++end;    }    baseclasses (p, super);}^[A-Z_][A-Z0-9_]*[ \t]*= { var_or_const (SN_CONS_DEF); }  ^[a-zA-Z_][a-zA-Z0-9_]*[ \t]*= { var_or_const (SN_GLOB_VAR_DEF); }  \n {   sn_advance_line();   sn_reset_column();}. { sn_advance_column(yyleng); }%%struct stack {    int indent;    int code;    char *name;    struct stack *prev;};static struct stack *scope_stack = NULL;static int calc_indent(char *start, char *stop){    int indent = 0;    char *cp = start;    while (cp < stop) {	switch (*cp++) {	case ' ':	    ++indent;	    break;	case '\t':	    indent = (indent / 8) * 8 + 8;	    break;	default:	    return indent;	}    }    return indent;}static char *top(int *code){    if (scope_stack) {	*code = scope_stack->code;	return scope_stack->name;    }    return NULL;}static void push(int indent, int code, char *name){    struct stack *node;    node = (struct stack *)malloc(sizeof (struct stack));    node->indent = indent;    node->code = code;    node->name = mystrdup (name);    node->prev = scope_stack;    scope_stack = node;}static void pop(int indent){    while (scope_stack && (scope_stack->indent >= indent)) {	scope_stack = scope_stack->prev;    }}static void baseclasses (char *classname, char *rest){    /* We enter here with something like " ( Tester ):" */    char *cp = rest;    char *base;    while (base = strtok (cp, "():, \t\r\n")) {	if (strchr (base, '.'))	    base = strrchr (base, '.') + 1;	cp = NULL;	/* I don't really know why we need a filename here, the	   base class may be defined in a totally different file */	sn_insert_symbol(SN_CLASS_INHERIT, classname, base,			 sn_current_file(),			 sn_line(), sn_column(), sn_line(), 			 sn_column() + strlen(base),			 0, NULL, NULL, NULL, NULL,			 sn_line(), sn_column(), sn_line(),			 sn_column() + strlen(base));    }}static void var_or_const (int code){    char *p;    /* point just before the '=', then go backwards to find and mark       the end of identifier */    p = yytext + yyleng - 1;    while ((p > yytext) && (p[-1] == ' ') || (p[-1] == '\t'))        --p;    *p = '\0';    sn_insert_symbol(code, NULL, yytext, sn_current_file(),		     sn_line(), sn_column(), sn_line(), 		     sn_column() + strlen(yytext),		     0, NULL, NULL, NULL, NULL,		     sn_line(), sn_column(), sn_line(),		     sn_column() + strlen(yytext));}static void parse_triple(int term){    int c;    int count;    while (1) {	c = input();	sn_advance_column (1);	if (c == term) {	    ++count;	    if (count == 3)		return;	} else {	    count = 0;	    switch (c) {	    case '\\':		c = input();		if (c <= 0)		    return;		if (c != '\n') {		    sn_advance_column (1);		    c = -1;		} else {		    sn_advance_line ();		}		break;	    case '\n':		sn_advance_line ();		sn_reset_column ();		break;	    case '\r':		sn_reset_column ();		break;	    case EOF:		return;	    }	}    }}static char *mystrdup(char *name){    char *p = malloc(strlen (name) + 1);    if (!p)	return NULL;    strcpy (p, name);    return p;}void reset(){   sn_reset_line();   sn_reset_column();   sn_reset_encoding();}intmain(int argc, char *argv[]){   return sn_main(argc, argv, group, &yyin, yylex, reset);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -