[geany/geany] f6068d: Add a Zephir tag parser

Colomban Wendling git-noreply at xxxxx
Fri Apr 10 15:06:47 UTC 2015


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Thu, 15 May 2014 14:58:04 UTC
Commit:      f6068d0e86331e65422bd6542b010f2d2ca08203
             https://github.com/geany/geany/commit/f6068d0e86331e65422bd6542b010f2d2ca08203

Log Message:
-----------
Add a Zephir tag parser

This Zephir parser uses the PHP parser with minor tweaking not to
require the initial PHP open tag and skip function return type hints.


Modified Paths:
--------------
    tagmanager/ctags/parsers.h
    tagmanager/ctags/php.c
    tagmanager/src/tm_parser.h

Modified: tagmanager/ctags/parsers.h
3 lines changed, 2 insertions(+), 1 deletions(-)
===================================================================
@@ -61,7 +61,8 @@
     ObjcParser, \
     AsciidocParser, \
     AbaqusParser, \
-    RustParser
+    RustParser, \
+    ZephirParser
 
 #endif	/* _PARSERS_H */
 


Modified: tagmanager/ctags/php.c
57 lines changed, 49 insertions(+), 8 deletions(-)
===================================================================
@@ -227,6 +227,7 @@ typedef struct {
 } tokenInfo;
 
 static langType Lang_php;
+static langType Lang_zephir;
 
 static boolean InPhp = FALSE; /* whether we are between <? ?> */
 
@@ -240,14 +241,14 @@ static struct {
 static vString *CurrentNamesapce;
 
 
-static void buildPhpKeywordHash (void)
+static void buildPhpKeywordHash (const langType language)
 {
 	const size_t count = sizeof (PhpKeywordTable) / sizeof (PhpKeywordTable[0]);
 	size_t i;
 	for (i = 0; i < count ; i++)
 	{
 		const keywordDesc* const p = &PhpKeywordTable[i];
-		addKeyword (p->name, Lang_php, (int) p->id);
+		addKeyword (p->name, language, (int) p->id);
 	}
 }
 
@@ -974,7 +975,7 @@ static void readToken (tokenInfo *const token)
 			else
 			{
 				parseIdentifier (token->string, c);
-				token->keyword = analyzeToken (token->string, Lang_php);
+				token->keyword = analyzeToken (token->string, getSourceLanguage ());
 				if (token->keyword == KEYWORD_NONE)
 					token->type = TOKEN_IDENTIFIER;
 				else
@@ -1180,6 +1181,17 @@ static boolean parseFunction (tokenInfo *const token, const tokenInfo *name)
 		readToken (token); /* normally it's an open brace or "use" keyword */
 	}
 
+	/* if parsing Zephir, skip function return type hint */
+	if (getSourceLanguage () == Lang_zephir && token->type == TOKEN_OPERATOR)
+	{
+		do
+			readToken (token);
+		while (token->type != TOKEN_EOF &&
+			   token->type != TOKEN_OPEN_CURLY &&
+			   token->type != TOKEN_CLOSE_CURLY &&
+			   token->type != TOKEN_SEMICOLON);
+	}
+
 	/* skip use(...) */
 	if (token->type == TOKEN_KEYWORD && token->keyword == KEYWORD_use)
 	{
@@ -1435,11 +1447,10 @@ static void enterScope (tokenInfo *const parentToken,
 	deleteToken (token);
 }
 
-static void findPhpTags (void)
+static void findTags (void)
 {
 	tokenInfo *const token = newToken ();
 
-	InPhp = FALSE;
 	CurrentStatement.access = ACCESS_UNDEFINED;
 	CurrentStatement.impl = IMPL_UNDEFINED;
 	CurrentNamesapce = vStringNew ();
@@ -1454,10 +1465,28 @@ static void findPhpTags (void)
 	deleteToken (token);
 }
 
-static void initialize (const langType language)
+static void findPhpTags (void)
+{
+	InPhp = FALSE;
+	findTags ();
+}
+
+static void findZephirTags (void)
+{
+	InPhp = TRUE;
+	findTags ();
+}
+
+static void initializePhpParser (const langType language)
 {
 	Lang_php = language;
-	buildPhpKeywordHash ();
+	buildPhpKeywordHash (language);
+}
+
+static void initializeZephirParser (const langType language)
+{
+	Lang_zephir = language;
+	buildPhpKeywordHash (language);
 }
 
 extern parserDefinition* PhpParser (void)
@@ -1468,7 +1497,19 @@ extern parserDefinition* PhpParser (void)
 	def->kindCount  = KIND_COUNT (PhpKinds);
 	def->extensions = extensions;
 	def->parser     = findPhpTags;
-	def->initialize = initialize;
+	def->initialize = initializePhpParser;
+	return def;
+}
+
+extern parserDefinition* ZephirParser (void)
+{
+	static const char *const extensions [] = { "zep", NULL };
+	parserDefinition* def = parserNew ("Zephir");
+	def->kinds      = PhpKinds;
+	def->kindCount  = KIND_COUNT (PhpKinds);
+	def->extensions = extensions;
+	def->parser     = findZephirTags;
+	def->initialize = initializeZephirParser;
 	return def;
 }
 


Modified: tagmanager/src/tm_parser.h
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -68,6 +68,7 @@ typedef enum
 	TM_PARSER_ASCIIDOC,
 	TM_PARSER_ABAQUS,
 	TM_PARSER_RUST,
+	TM_PARSER_ZEPHIR,
 	TM_PARSER_COUNT
 } TMParserType;
 



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list