1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
/*
* Copyright (c) 2020, Masatake YAMATO
*
* This source code is released for free distribution under the terms of the
* GNU General Public License version 2 or (at your option) any later version.
*
* Tex base parser interface exported to subparsers
*/
#ifndef CTAGS_PARSER_TEX_H
#define CTAGS_PARSER_TEX_H
/*
* INCLUDE FILES
*/
#include "general.h" /* must always come first */
#include "subparser.h"
#include "vstring.h"
/*
* DATA DEFINITIONS
*/
/* Parsing strategy */
enum TexNameFlag {
/* Allow that the type of input token doesn't match
* the type of strategy. In stread of aborting,
* apply the next strategy to the same token. */
TEX_NAME_FLAG_OPTIONAL = (1 << 0),
/* When reading tokens inside pair,
* whitespaces are considered as parts of a token or not. */
TEX_NAME_FLAG_INCLUDING_WHITESPACE = (1 << 1),
/* If a tag is created with this strategy, don't
* create a tag in its successor strategies. */
TEX_NAME_FLAG_EXCLUSIVE = (1 << 2),
};
struct TexParseStrategy {
/* Expected token type '<', '[', '*', '{', and '\\' are supported.
* 0 means the end of strategies. '\\' means {} pair may be omitted.
*
* A string between <>, [], or {} (pairs) can be tagged or store to
* a vString. See kindIndex and name field of this structure.
*/
int type;
/* Bits combination of enum TexNameFlag */
unsigned int flags;
/* Kind and role for making a tag for the string surrounded by one of pairs.
* If you don't need to make a tag for the string,
* specify KIND_GHOST_INDEX. */
int kindIndex;
int roleIndex;
/* If a tag is made, Tex parser stores its cork index here. */
int corkIndex;
/* Store the string surrounded by one of paris.
* If you don't need to store the string, set NULL here. */
vString *name;
/* If true, make at most one tag for the name in the scope specified
* with scopeIndex. When making a tag, scopeIndex is set to
* extensionFields.scopeIndex only if unique is true.
* scopeIndex is never referred if unique if false. */
bool unique;
int scopeIndex;
};
typedef struct sTexSubparser texSubparser;
struct sTexSubparser {
subparser subparser;
/* When Tex parser reads an \begin{foo}, it calls
* this method.
*
* A subparser having interests in successor tokens may return strategies.
* If it doesn't, just return NULL; Tex base parser may call the next subparser.
*/
struct TexParseStrategy * (* readEnviromentBeginNotify) (texSubparser *s,
vString *env);
/* When Tex parser reads an \end{foo}, it calls
* this method.
*
* If this method returns true, Tex base parser may call the next subparser.
* If it returns false, Tex base parser stops calling the rest of subparsers.
*/
bool (* readEnviromentEndNotify) (texSubparser *s, vString *env);
/* When Tex parser reads an \identifier, it calls
* this method.
*
* A subparser having interests in successor tokens may return strategies.
* If it has no interest, just return NULL; Tex base parser may call next subparser.
*/
struct TexParseStrategy *(* readIdentifierNotify) (texSubparser *s,
vString *identifier);
/* After Tex parser runs the strategies returned from readIdentifierNotify
* method, Tex parser calls this method to notify the subparser the result
* of running the strategies; corkIndex and/or name fields of strategies
* may be filled. */
void (* reportStrategicParsing) (texSubparser *s,
const struct TexParseStrategy *strategy);
};
#endif /* CTAGS_PARSER_TEX_H */
|