亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? extending.html

?? ctags的最新版5.7,可以比較5.6版看看,免費下載
?? HTML
字號:
<!-- $Id: EXTENDING.html 198 2002-09-04 01:17:32Z darren $ --><html><head><title>Exuberant Ctags: Adding support for a new language</title></head><body><h1>How to Add Support for a New Language to Exuberant Ctags</h1><p><b>Exuberant Ctags</b> has been designed to make it very easy to add your owncustom language parser. As an exercise, let us assume that I want to addsupport for my new language, <em>Swine</em>, the successor to Perl (i.e. Perlbefore Swine &lt;wince&gt;). This language consists of simple definitions oflabels in the form "<code>def my_label</code>". Let us now examine the variousways to do this.</p><h2>Operational background</h2><p>As ctags considers each file name, it tries to determine the language of thefile by applying the following three tests in order: if the file extension hasbeen mapped to a language, if the file name matches a shell pattern mapped toa language, and finally if the file is executable and its first line specifiesan interpreter using the Unix-style "#!" specification (if supported on theplatform). If a language was identified, the file is opened and then theappropriate language parser is called to operate on the currently open file.The parser parses through the file and whenever it finds some interestingtoken, calls a function to define a tag entry.</p><h2>Creating a user-defined language</h2><p>The quickest and easiest way to do this is by defining a new language usingthe program options. In order to have Swine support available every time Istart ctags, I will place the following lines into the file<code>$HOME/.ctags</code>, which is read in every time ctags starts:<code><pre>  --langdef=swine  --langmap=swine:.swn  --regex-swine=/^def[ \t]*([a-zA-Z0-9_]+)/\1/d,definition/</pre></code>The first line defines the new language, the second maps a file extension toit, and the third defines a regular expression to identify a languagedefinition and generate a tag file entry for it.</p><h2>Integrating a new language parser</h2><p>Now suppose that I want to truly integrate compiled-in support for Swine intoctags. First, I create a new module, <code>swine.c</code>, and add oneexternally visible function to it, <code>extern parserDefinition*SwineParser(void)</code>, and add its name to the table in<code>parsers.h</code>. The job of this parser definition function is tocreate an instance of the <code>parserDefinition</code> structure (using<code>parserNew()</code>) and populate it with information defining how filesof this language are recognized, what kinds of tags it can locate, and thefunction used to invoke the parser on the currently open file.</p><p>The structure <code>parserDefinition</code> allows assignment of the followingfields:<code><pre>  const char *name;               /* name of language */  kindOption *kinds;              /* tag kinds handled by parser */  unsigned int kindCount;         /* size of `kinds' list */  const char *const *extensions;  /* list of default extensions */  const char *const *patterns;    /* list of default file name patterns */  parserInitialize initialize;    /* initialization routine, if needed */  simpleParser parser;            /* simple parser (common case) */  rescanParser parser2;           /* rescanning parser (unusual case) */  boolean regex;                  /* is this a regex parser? */</pre></code></p><p>The <code>name</code> field must be set to a non-empty string. Also, unless<code>regex</code> is set true (see below), either <code>parser</code> or<code>parser2</code> must set to point to a parsing routine which willgenerate the tag entries. All other fields are optional.<p>Now all that is left is to implement the parser. In order to do its job, theparser should read the file stream using using one of the two I/O interfaces:either the character-oriented <code>fileGetc()</code>, or the line-oriented<code>fileReadLine()</code>. When using <code>fileGetc()</code>, the parsercan put back a character using <code>fileUngetc()</code>. How our Swine parseractually parses the contents of the file is entirely up to the writer of theparser--it can be as crude or elegant as desired. You will note a variety ofexamples from the most complex (c.c) to the simplest (make.c).</p><p>When the Swine parser identifies an interesting token for which it wants toadd a tag to the tag file, it should create a <code>tagEntryInfo</code>structure and initialize it by calling <code>initTagEntry()</code>, whichinitializes defaults and fills information about the current line number andthe file position of the beginning of the line. After filling in informationdefining the current entry (and possibly overriding the file position or otherdefaults), the parser passes this structure to <code>makeTagEntry()</code>.</p><p>Instead of writing a character-oriented parser, it may be possible to specifyregular expressions which define the tags. In this case, instead of defining aparsing function, <code>SwineParser()</code>, sets <code>regex</code> to true,and points <code>initialize</code> to a function which calls<code>addTagRegex()</code> to install the regular expressions which define itstags. The regular expressions thus installed are compared against each line of the input file and generate a specified tag when matched. It is usuallymuch easier to write a regex-based parser, although they can be slower (oneparser example was 4 times slower). Whether the speed difference matters toyou depends upon how much code you have to parse. It is probably a goodstrategy to implement a regex-based parser first, and if it is too slow foryou, then invest the time and effort to write a character-based parser.</p><p>A regex-based parser is inherently line-oriented (i.e. the entire tag must berecognizable from looking at a single line) and context-insensitive (i.e thegeneration of the tag is entirely based upon when the regular expressionmatches a single line). However, a regex-based callback mechanism is alsoavailable, installed via the function <code>addCallbackRegex()</code>. Thisallows a specified function to be invoked whenever a specific regularexpression is matched. This allows a character-oriented parser to operatebased upon context of what happened on a previous line (e.g. the start or endof a multi-line comment). Note that regex callbacks are called just before thefirst character of that line can is read via either <code>fileGetc()</code> orusing <code>fileGetc()</code>. The effect of this is that before either ofthese routines return, a callback routine may be invoked because the linematched a regex callback. A callback function to be installed is defined bythese types:<code><pre>  typedef void (*regexCallback) (const char *line, const regexMatch *matches, unsigned int count);  typedef struct {      size_t start;   /* character index in line where match starts */      size_t length;  /* length of match */  } regexMatch;</pre></code></p><p>The callback function is passed the line matching the regular expression andan array of <code>count</code> structures defining the subexpression matchesof the regular expression, starting from \0 (the entire line).</p><p>Lastly, be sure to add your the name of the file containing your parser (e.g.swine.c) to the macro <code>SOURCES</code> in the file <code>source.mak</code>and an entry for the object file to the macro <code>OBJECTS</code> in the samefile, so that your new module will be compiled into the program.</p><p>This is all there is to it. All other details are specific to the parser andhow it wants to do its job. There are some support functions which can takecare of some commonly needed parsing tasks, such as keyword table lookups (seekeyword.c), which you can make use of if desired (examples of its use can befound in c.c, eiffel.c, and fortran.c). Almost everything is already taken careof automatically for you by the infrastructure.  Writing the actual parsingalgorithm is the hardest part, but is not constrained by any need to conformto anything in ctags other than that mentioned above.</p><p>There are several different approaches used in the parsers inside <b>ExuberantCtags</b> and you can browse through these as examples of how to go aboutcreating your own.</p><h2>Examples</h2><p>Below you will find several example parsers demonstrating most of thefacilities available. These include three alternative implementationsof a Swine parser, which generate tags for lines beginning with"<CODE>def</CODE>" followed by some name.</p><code><pre>/*************************************************************************** * swine.c * Character-based parser for Swine definitions **************************************************************************//* INCLUDE FILES */#include "general.h"    /* always include first */#include &lt;string.h&gt;     /* to declare strxxx() functions */#include &lt;ctype.h&gt;      /* to define isxxx() macros */#include "parse.h"      /* always include */#include "read.h"       /* to define file fileReadLine() *//* DATA DEFINITIONS */typedef enum eSwineKinds {    K_DEFINE} swineKind;static kindOption SwineKinds [] = {    { TRUE, 'd', "definition", "pig definition" }};/* FUNCTION DEFINITIONS */static void findSwineTags (void){    vString *name = vStringNew ();    const unsigned char *line;    while ((line = fileReadLine ()) != NULL)    {        /* Look for a line beginning with "def" followed by name */        if (strncmp ((const char*) line, "def", (size_t) 3) == 0  &amp;&amp;            isspace ((int) line [3]))        {            const unsigned char *cp = line + 4;            while (isspace ((int) *cp))                ++cp;            while (isalnum ((int) *cp)  ||  *cp == '_')            {                vStringPut (name, (int) *cp);                ++cp;            }            vStringTerminate (name);            makeSimpleTag (name, SwineKinds, K_DEFINE);            vStringClear (name);        }    }    vStringDelete (name);}/* Create parser definition stucture */extern parserDefinition* SwineParser (void){    static const char *const extensions [] = { "swn", NULL };    parserDefinition* def = parserNew ("Swine");    def-&gt;kinds      = SwineKinds;    def-&gt;kindCount  = KIND_COUNT (SwineKinds);    def-&gt;extensions = extensions;    def-&gt;parser     = findSwineTags;    return def;}</pre></code><p><pre><code>/*************************************************************************** * swine.c * Regex-based parser for Swine **************************************************************************//* INCLUDE FILES */#include "general.h"    /* always include first */#include "parse.h"      /* always include *//* FUNCTION DEFINITIONS */static void installSwineRegex (const langType language){    addTagRegex (language, "^def[ \t]*([a-zA-Z0-9_]+)", "\\1", "d,definition", NULL);}/* Create parser definition stucture */extern parserDefinition* SwineParser (void){    static const char *const extensions [] = { "swn", NULL };    parserDefinition* def = parserNew ("Swine");    parserDefinition* const def = parserNew ("Makefile");    def-&gt;patterns   = patterns;    def-&gt;extensions = extensions;    def-&gt;initialize = installMakefileRegex;    def-&gt;regex      = TRUE;    return def;}</code></pre><p><pre>/*************************************************************************** * swine.c * Regex callback-based parser for Swine definitions **************************************************************************//* INCLUDE FILES */#include "general.h"    /* always include first */#include "parse.h"      /* always include */#include "read.h"       /* to define file fileReadLine() *//* DATA DEFINITIONS */typedef enum eSwineKinds {    K_DEFINE} swineKind;static kindOption SwineKinds [] = {    { TRUE, 'd', "definition", "pig definition" }};/* FUNCTION DEFINITIONS */static void definition (const char *const line, const regexMatch *const matches,                       const unsigned int count){    if (count &gt; 1)    /* should always be true per regex */    {        vString *const name = vStringNew ();        vStringNCopyS (name, line + matches [1].start, matches [1].length);        makeSimpleTag (name, SwineKinds, K_DEFINE);    }}static void findSwineTags (void){    while (fileReadLine () != NULL)        ;  /* don't need to do anything here since callback is sufficient */}static void installSwine (const langType language){    addCallbackRegex (language, "^def[ \t]+([a-zA-Z0-9_]+)", NULL, definition);}/* Create parser definition stucture */extern parserDefinition* SwineParser (void){    static const char *const extensions [] = { "swn", NULL };    parserDefinition* def = parserNew ("Swine");    def-&gt;kinds      = SwineKinds;    def-&gt;kindCount  = KIND_COUNT (SwineKinds);    def-&gt;extensions = extensions;    def-&gt;parser     = findSwineTags;    def-&gt;initialize = installSwine;    return def;}</pre><p><pre>/*************************************************************************** * make.c * Regex-based parser for makefile macros **************************************************************************//* INCLUDE FILES */#include "general.h"    /* always include first */#include "parse.h"      /* always include *//* FUNCTION DEFINITIONS */static void installMakefileRegex (const langType language){    addTagRegex (language, "(^|[ \t])([A-Z0-9_]+)[ \t]*:?=", "\\2", "m,macro", "i");}/* Create parser definition stucture */extern parserDefinition* MakefileParser (void){    static const char *const patterns [] = { "[Mm]akefile", NULL };    static const char *const extensions [] = { "mak", NULL };    parserDefinition* const def = parserNew ("Makefile");    def-&gt;patterns   = patterns;    def-&gt;extensions = extensions;    def-&gt;initialize = installMakefileRegex;    def-&gt;regex      = TRUE;    return def;}</pre></body></html>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆免费视频| 欧美日韩和欧美的一区二区| 亚洲乱码国产乱码精品精小说 | 国产精品久久免费看| 欧美视频你懂的| 国产成人午夜电影网| 亚洲h在线观看| 中文字幕一区二区三区不卡 | 日韩精品国产精品| 亚洲视频你懂的| 精品美女一区二区| 91精品国产综合久久香蕉麻豆| www.亚洲在线| 国产一区二区三区黄视频 | 久久草av在线| 午夜精品久久久久久久久久| 国产精品久久久久久久久晋中 | 日本va欧美va欧美va精品| 最新国产成人在线观看| 26uuu久久天堂性欧美| 欧美一区二区精美| 欧美图片一区二区三区| 91亚洲男人天堂| 成av人片一区二区| 国产91精品一区二区麻豆亚洲| 日本三级韩国三级欧美三级| 一区二区高清在线| 国产精品久久99| 中文字幕欧美国产| 欧美国产成人精品| 久久久精品影视| 久久久亚洲午夜电影| 精品国产区一区| 久久综合狠狠综合| 日韩免费高清av| 日韩欧美中文字幕一区| 日韩无一区二区| 日韩一区二区免费视频| 欧美丰满一区二区免费视频| 欧美美女直播网站| 欧美精品自拍偷拍动漫精品| 欧美日本国产一区| 日韩欧美成人一区二区| 91麻豆精品国产91久久久资源速度 | 成人激情校园春色| 国产不卡视频一区| av动漫一区二区| 日本韩国欧美国产| 欧美主播一区二区三区美女| 欧美日韩专区在线| 日韩一级片网站| 久久久国产午夜精品| 国产精品美女久久久久久久久久久 | av不卡在线观看| 91国产免费观看| 欧美日韩成人在线一区| 欧美电视剧免费全集观看 | 日韩中文字幕亚洲一区二区va在线| 亚洲va欧美va天堂v国产综合| 视频一区国产视频| 国产在线看一区| 成人动漫中文字幕| 91成人在线精品| 日韩一区二区不卡| 国产亚洲精品免费| 樱花草国产18久久久久| 午夜伊人狠狠久久| 国产一区二区三区在线观看免费| 成人午夜大片免费观看| 日本韩国一区二区三区| 日韩欧美国产三级电影视频| 国产色一区二区| 亚洲成人综合视频| 国产在线精品一区二区夜色| 成人精品电影在线观看| 欧美日韩的一区二区| 国产欧美日韩在线视频| 一区二区三区在线免费播放| 蜜臀久久99精品久久久久宅男 | 在线不卡a资源高清| 在线成人免费视频| 日本视频免费一区| 日韩成人伦理电影在线观看| 国产精品综合视频| 欧美主播一区二区三区美女| 精品久久国产97色综合| 亚洲黄色av一区| 国产一区二区久久| 欧美三级日韩在线| 国产三级欧美三级| 天天操天天色综合| 99久久精品99国产精品| 欧美电视剧在线看免费| 一区二区三区在线观看视频| 国产精品综合二区| 91麻豆精品国产91久久久久久| 136国产福利精品导航| 精品午夜久久福利影院| 欧美色涩在线第一页| 国产精品理论片在线观看| 美女精品自拍一二三四| 一本色道久久加勒比精品| 久久九九99视频| 美女高潮久久久| 欧美理论片在线| 亚洲另类在线视频| 成人黄页毛片网站| 久久久综合九色合综国产精品| 亚洲香肠在线观看| 91免费视频网址| 国产精品久久久久久久久免费丝袜| 一区二区三区在线观看欧美| 成人美女在线视频| 久久亚洲免费视频| 六月丁香婷婷久久| 欧美高清dvd| 日韩影院在线观看| 欧美午夜一区二区三区| 亚洲欧美电影院| 成人永久看片免费视频天堂| 精品美女一区二区三区| 毛片av中文字幕一区二区| 欧美日韩一区二区不卡| 亚洲综合无码一区二区| 99国产精品国产精品久久| 国产精品成人午夜| 不卡免费追剧大全电视剧网站| 久久精品日韩一区二区三区| 久久99久久精品| 日韩精品一区二区三区在线观看 | 韩国精品一区二区| 日韩女优电影在线观看| 美国一区二区三区在线播放| 欧美久久久一区| 日韩精品国产欧美| 日韩一区二区三区免费观看| 捆绑调教一区二区三区| 日韩精品中文字幕在线不卡尤物| 捆绑变态av一区二区三区| 国产一区二区三区四区五区入口 | 精品视频全国免费看| 亚洲激情第一区| 欧美中文字幕一区二区三区 | 图片区日韩欧美亚洲| 欧美日韩国产天堂| 日本亚洲最大的色成网站www| 日韩欧美一区二区在线视频| 久久99精品久久只有精品| 久久综合成人精品亚洲另类欧美| 国产做a爰片久久毛片| 欧美国产精品v| 91捆绑美女网站| 亚洲国产精品久久久男人的天堂| 欧美日韩一区二区三区不卡| 轻轻草成人在线| 亚洲精品一区二区三区99| 成人手机电影网| 亚洲图片另类小说| 欧美丰满一区二区免费视频| 久久狠狠亚洲综合| 国产农村妇女精品| 91国在线观看| 免费成人结看片| 国产精品乱人伦| 欧美日韩久久一区| 国模冰冰炮一区二区| 亚洲欧洲成人精品av97| 欧美日韩亚洲综合| 国产高清不卡一区二区| 一区二区三区资源| 欧美一区二区三区婷婷月色| 国产成人在线观看| 一区二区激情小说| 欧美精品一区二区三| 91麻豆免费在线观看| 麻豆91免费看| 亚洲欧洲性图库| 91精品国产麻豆国产自产在线| 久久精品国产色蜜蜜麻豆| 综合久久久久久久| 日韩视频免费观看高清完整版 | 日韩精品一区二区三区蜜臀| 成人免费不卡视频| 日韩电影在线一区二区| 国产精品久久久久久户外露出 | 欧美日韩高清一区二区三区| 国产一区二区三区日韩| 亚洲影院免费观看| 国产亚洲欧洲997久久综合 | 色综合久久久久久久久久久| 天堂精品中文字幕在线| 国产日韩欧美不卡在线| 欧美日韩国产bt| 99久久精品国产毛片| 美日韩一区二区三区| 亚洲综合免费观看高清完整版 | 国内精品伊人久久久久av一坑 | 裸体在线国模精品偷拍| 亚洲天堂2014| 国产天堂亚洲国产碰碰|