xref: /Universal-ctags/peg/thrift.peg (revision 243bfd56d3e6ce287995c1fff534e20047e1babc)
13532d591SMasatake YAMATO#
23532d591SMasatake YAMATO# This file is derived from
33532d591SMasatake YAMATO# https://raw.githubusercontent.com/samuel/go-thrift/master/parser/grammar.peg
43532d591SMasatake YAMATO# (commit id: 586f6174a55deba8cbe982f15ecc28a901e44f4a)
53532d591SMasatake YAMATO#
63532d591SMasatake YAMATO# Reference:
73532d591SMasatake YAMATO#     - https://thrift.apache.org/docs/idl
83532d591SMasatake YAMATO#     - https://diwakergupta.github.io/thrift-missing-guide/
93532d591SMasatake YAMATO#
103532d591SMasatake YAMATO#
113532d591SMasatake YAMATO# Copyright (c) 2012, Samuel Stauffer <samuel@descolada.com>
123532d591SMasatake YAMATO# All rights reserved.
133532d591SMasatake YAMATO#
143532d591SMasatake YAMATO# Redistribution and use in source and binary forms, with or without
153532d591SMasatake YAMATO# modification, are permitted provided that the following conditions are met:
163532d591SMasatake YAMATO#
173532d591SMasatake YAMATO# * Redistributions of source code must retain the above copyright
183532d591SMasatake YAMATO#   notice, this list of conditions and the following disclaimer.
193532d591SMasatake YAMATO# * Redistributions in binary form must reproduce the above copyright
203532d591SMasatake YAMATO#   notice, this list of conditions and the following disclaimer in the
213532d591SMasatake YAMATO#   documentation and/or other materials provided with the distribution.
223532d591SMasatake YAMATO# * Neither the name of the author nor the
233532d591SMasatake YAMATO#   names of its contributors may be used to endorse or promote products
243532d591SMasatake YAMATO#   derived from this software without specific prior written permission.
253532d591SMasatake YAMATO#
263532d591SMasatake YAMATO# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
273532d591SMasatake YAMATO# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
283532d591SMasatake YAMATO# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
293532d591SMasatake YAMATO# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
303532d591SMasatake YAMATO# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
313532d591SMasatake YAMATO# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
323532d591SMasatake YAMATO# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
333532d591SMasatake YAMATO# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
343532d591SMasatake YAMATO# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
353532d591SMasatake YAMATO# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
363532d591SMasatake YAMATO#
373532d591SMasatake YAMATO%prefix "pthrift"
383532d591SMasatake YAMATO
393532d591SMasatake YAMATO%auxil "struct parserCtx *"
403532d591SMasatake YAMATO
413532d591SMasatake YAMATO%earlysource {
423532d591SMasatake YAMATO    #include "general.h"
433532d591SMasatake YAMATO}
443532d591SMasatake YAMATO
453532d591SMasatake YAMATO%header {
463532d591SMasatake YAMATO    struct parserCtx;
473532d591SMasatake YAMATO}
483532d591SMasatake YAMATO
493532d591SMasatake YAMATO%source {
503532d591SMasatake YAMATO#include "thrift_pre.h"
513532d591SMasatake YAMATO#include "routines.h"
523532d591SMasatake YAMATO}
533532d591SMasatake YAMATO
543532d591SMasatake YAMATOGrammar <- __ ( Statement __ )* (EOF / SyntaxError)
553532d591SMasatake YAMATOSyntaxError <- .
563532d591SMasatake YAMATO
573532d591SMasatake YAMATO# MODIFIED
584483ed95SMasatake YAMATOInclude <- <( "include" / "cpp_include" )> _ <Literal> EOS {
593532d591SMasatake YAMATO    vString *f = unliteral ($2);
603532d591SMasatake YAMATO    if (vStringLength(f) > 0)
61*243bfd56SMasatake YAMATO    {
62*243bfd56SMasatake YAMATO        if ($1[0] == 'i')
633532d591SMasatake YAMATO            makeThriftTagFull (auxil, vStringValue (f), $2s, K_THRIFTFILE, THRIFT_THRIFT_FILE_INCLUDED, false);
64*243bfd56SMasatake YAMATO        else
65*243bfd56SMasatake YAMATO        {
66*243bfd56SMasatake YAMATO            tagEntryInfo e;
67*243bfd56SMasatake YAMATO            initForeignRefTagEntry (&e, vStringValue(f), getNamedLanguage ("C++", 0), CXXTagKindINCLUDE, CR_HEADER_LOCAL);
68*243bfd56SMasatake YAMATO            e.lineNumber = getInputLineNumberForFileOffset ($2s);
69*243bfd56SMasatake YAMATO            e.filePosition = getInputFilePositionForLine (e.lineNumber);
70*243bfd56SMasatake YAMATO            makeTagEntry (&e);
713532d591SMasatake YAMATO        }
72*243bfd56SMasatake YAMATO    }
73*243bfd56SMasatake YAMATO    vStringDelete (f);
744483ed95SMasatake YAMATO}
753532d591SMasatake YAMATO
763532d591SMasatake YAMATOStatement <- Include / Namespace / Const / Enum / TypeDef / Struct / Exception / Union / Service
773532d591SMasatake YAMATO
783532d591SMasatake YAMATONamespace <- "namespace" _ <[-*a-z.]+> _ <Identifier> {
793532d591SMasatake YAMATO    int r = makeThriftTag (auxil, $2, $2s, K_NAMESPACE, false);
803532d591SMasatake YAMATO    attachParserFieldToCorkEntry (r, ThriftFields[F_TARGET].ftype, $1);
813532d591SMasatake YAMATO} EOS
823532d591SMasatake YAMATO
833532d591SMasatake YAMATOConst <- "const" _ <FieldType> _ <Identifier> {
843532d591SMasatake YAMATO    int r = makeThriftTag (auxil, $2, $2s, K_CONST, false);
853532d591SMasatake YAMATO    tagEntryInfo *e = getEntryInCorkQueue (r);
863532d591SMasatake YAMATO    if (e)
873532d591SMasatake YAMATO    {
883532d591SMasatake YAMATO        e->extensionFields.typeRef[0] = eStrdup ("typename");
893532d591SMasatake YAMATO        e->extensionFields.typeRef[1] = eStrdup ($1);
903532d591SMasatake YAMATO    }
913532d591SMasatake YAMATO} __ "=" __ ConstValue _ ListSeparator? EOS
923532d591SMasatake YAMATO# MODIFIED
933532d591SMasatake YAMATO
943532d591SMasatake YAMATOEnum <- "enum" { PUSH_KIND (auxil, K_ENUM); } _ <Identifier> {
953532d591SMasatake YAMATO    makeThriftTag (auxil, $1, $1s, USE_KIND_STACK, true);
963532d591SMasatake YAMATO} __ '{' __ (EnumValue __)* '}' _ TypeAnnotations? EOS { POP_KIND (auxil, true); }
973532d591SMasatake YAMATO
983532d591SMasatake YAMATOEnumValue <- <Identifier> {
993532d591SMasatake YAMATO    makeThriftTag (auxil, $1, $1s, K_ENUMERATOR, false);
1003532d591SMasatake YAMATO} _ ('=' _ IntConstant)? _ TypeAnnotations? ListSeparator?
1013532d591SMasatake YAMATO
1023532d591SMasatake YAMATO
1033532d591SMasatake YAMATOTypeDef <- "typedef" _ <FieldType> _ <Identifier> {
1043532d591SMasatake YAMATO    int r = makeThriftTag (auxil, $2, $2s, K_TYPEDEF, false);
1053532d591SMasatake YAMATO    tagEntryInfo *e = getEntryInCorkQueue (r);
1063532d591SMasatake YAMATO    if (e)
1073532d591SMasatake YAMATO    {
1083532d591SMasatake YAMATO        e->extensionFields.typeRef[0] = eStrdup ("typename");
1093532d591SMasatake YAMATO        e->extensionFields.typeRef[1] = eStrdup ($1);
1103532d591SMasatake YAMATO    }
1113532d591SMasatake YAMATO} _ TypeAnnotations? EOS
1123532d591SMasatake YAMATO
1133532d591SMasatake YAMATOStruct <- "struct" { PUSH_KIND (auxil, K_STRUCT); }_ StructLike { POP_KIND (auxil, true); }
1143532d591SMasatake YAMATOException <- "exception" { PUSH_KIND (auxil, K_EXCEPTION); } _ StructLike { POP_KIND (auxil, true); }
1153532d591SMasatake YAMATOUnion <- "union" { PUSH_KIND (auxil, K_UNION); }  _ StructLike { POP_KIND (auxil, true); }
1163532d591SMasatake YAMATOStructLike <- <Identifier> {
1173532d591SMasatake YAMATO    makeThriftTag (auxil, $1, $1s, USE_KIND_STACK, true);
1183532d591SMasatake YAMATO    PUSH_KIND (auxil, K_MEMBER);
1193532d591SMasatake YAMATO} __ '{' __ FieldList '}' _ TypeAnnotations? EOS { POP_KIND (auxil, false); }
1203532d591SMasatake YAMATO
1213532d591SMasatake YAMATOFieldList <- (Field __)*
1223532d591SMasatake YAMATO
1233532d591SMasatake YAMATOField <- IntConstant _ ':' _ FieldReq? _ <FieldType> _ <Identifier> {
1243532d591SMasatake YAMATO    int r = makeThriftTag (auxil, $2, $2s, USE_KIND_STACK, false);
1253532d591SMasatake YAMATO    tagEntryInfo *e = getEntryInCorkQueue (r);
1263532d591SMasatake YAMATO    if (e)
1273532d591SMasatake YAMATO    {
1283532d591SMasatake YAMATO        e->extensionFields.typeRef[0] = eStrdup ("typename");
1293532d591SMasatake YAMATO        e->extensionFields.typeRef[1] = eStrdup ($1);
1303532d591SMasatake YAMATO    }
1313532d591SMasatake YAMATO} __ ('=' _ ConstValue)? _ TypeAnnotations? ListSeparator?
1323532d591SMasatake YAMATO
1333532d591SMasatake YAMATOFieldReq <- ("required" / "optional")
1343532d591SMasatake YAMATO
1353532d591SMasatake YAMATOService <- "service" _ <Identifier> {
1363532d591SMasatake YAMATO    makeThriftTag (auxil, $1, $1s, K_SERVICE, true);
1373532d591SMasatake YAMATO} _ ("extends" __ <Identifier> {
1383532d591SMasatake YAMATO        int r = BASE_SCOPE (auxil);
1393532d591SMasatake YAMATO        tagEntryInfo *e = getEntryInCorkQueue (r);
1403532d591SMasatake YAMATO        if (e)
1413532d591SMasatake YAMATO            e->extensionFields.inheritance = eStrdup ($2);
1423532d591SMasatake YAMATO} __)? __ '{' __ (Function __)* ('}' / EndOfServiceError) _ TypeAnnotations?  EOS {
1433532d591SMasatake YAMATO    POP_SCOPE (auxil);
1443532d591SMasatake YAMATO}
1453532d591SMasatake YAMATOEndOfServiceError <- .
1463532d591SMasatake YAMATO
1473532d591SMasatake YAMATOFunction <- ("oneway" __)? <FunctionType> __ <Identifier> {
1483532d591SMasatake YAMATO    int r = makeThriftTag (auxil, $2, $2s, K_FUNCTION, true);
1493532d591SMasatake YAMATO    tagEntryInfo *e = getEntryInCorkQueue (r);
1503532d591SMasatake YAMATO    if (e)
1513532d591SMasatake YAMATO    {
1523532d591SMasatake YAMATO        e->extensionFields.typeRef[0] = eStrdup ("typename");
1533532d591SMasatake YAMATO        e->extensionFields.typeRef[1] = eStrdup ($1);
1543532d591SMasatake YAMATO    }
1553532d591SMasatake YAMATO    PUSH_KIND (auxil, K_PARAMETER);
1563532d591SMasatake YAMATO} _ <'(' __ FieldList ')'> {
1573532d591SMasatake YAMATO    int r = BASE_SCOPE (auxil);
1583532d591SMasatake YAMATO    tagEntryInfo *e = getEntryInCorkQueue (r);
1593532d591SMasatake YAMATO    if (e)
1603532d591SMasatake YAMATO         e->extensionFields.signature = eStrdup ($3);
1613532d591SMasatake YAMATO} __ Throws? _ TypeAnnotations? ListSeparator? { POP_KIND (auxil, true); }
1623532d591SMasatake YAMATO
1633532d591SMasatake YAMATOFunctionType <- ("void" / FieldType)
1643532d591SMasatake YAMATO
1653532d591SMasatake YAMATOThrows <- "throws" { PUSH_KIND (auxil, K_THROWSPARAM); } __ < '(' __ FieldList ')' > {
1663532d591SMasatake YAMATO    int r = BASE_SCOPE (auxil);
1673532d591SMasatake YAMATO    attachParserFieldToCorkEntry (r, ThriftFields[F_THROWS].ftype, $1);
1683532d591SMasatake YAMATO    POP_KIND (auxil, false);
1693532d591SMasatake YAMATO}
1703532d591SMasatake YAMATO
1713532d591SMasatake YAMATOFieldType <- (BaseType / ContainerType / Identifier)
1723532d591SMasatake YAMATO
1733532d591SMasatake YAMATO# DefinitionType <- (BaseType / ContainerType)
1743532d591SMasatake YAMATO
1753532d591SMasatake YAMATOBaseType <- BaseTypeName _ TypeAnnotations?
1763532d591SMasatake YAMATO
1773532d591SMasatake YAMATOBaseTypeName <- ("bool" / "byte" / "i16" / "i32" / "i64" / "double" / "string" / "binary" )
1783532d591SMasatake YAMATO
1793532d591SMasatake YAMATOContainerType <- (MapType / SetType / ListType)
1803532d591SMasatake YAMATO
1813532d591SMasatake YAMATOMapType <- CppType? "map" WS "<" WS FieldType WS "," WS FieldType WS ">" _ TypeAnnotations?
1823532d591SMasatake YAMATO
1833532d591SMasatake YAMATOSetType <- CppType? "set" WS "<" WS FieldType WS ">" _ TypeAnnotations?
1843532d591SMasatake YAMATO
1853532d591SMasatake YAMATOListType <- "list" WS "<" WS FieldType WS ">" _ TypeAnnotations?
1863532d591SMasatake YAMATO
1873532d591SMasatake YAMATOCppType <- "cpp_type" Literal
1883532d591SMasatake YAMATO
1893532d591SMasatake YAMATOConstValue <- Literal / DoubleConstant / IntConstant / ConstMap / ConstList / Identifier
1903532d591SMasatake YAMATO
1913532d591SMasatake YAMATOTypeAnnotations <- '(' __ TypeAnnotation* ')'
1923532d591SMasatake YAMATO
1933532d591SMasatake YAMATOTypeAnnotation <- Identifier _ ('=' __ Literal)? ListSeparator? __
1943532d591SMasatake YAMATO
1953532d591SMasatake YAMATOIntConstant <- [-+]? Digit+
1963532d591SMasatake YAMATO
1973532d591SMasatake YAMATODoubleConstant <- [-+]? Digit* '.' Digit* ( ['Ee'] IntConstant )?
1983532d591SMasatake YAMATO
1993532d591SMasatake YAMATOConstList <- '[' __ (ConstValue __ ListSeparator? __)* __ ']'
2003532d591SMasatake YAMATO
2013532d591SMasatake YAMATO# MODIFIED
2023532d591SMasatake YAMATOConstMap <- '{' __ (ConstValue __ ':' __ ConstValue __ (ListSeparator? / &'}') __)* '}'
2033532d591SMasatake YAMATO
2043532d591SMasatake YAMATO# ...
2053532d591SMasatake YAMATOLiteral <- (('"' ("\\\"" / [^"])* '"') / ("'" ("\\'" / [^'])* "'"))
2063532d591SMasatake YAMATO# '"
2073532d591SMasatake YAMATO
2083532d591SMasatake YAMATOIdentifier <- (Letter / '_')+ (Letter / Digit / [._])*
2093532d591SMasatake YAMATO
2103532d591SMasatake YAMATOListSeparator <- [,;]
2113532d591SMasatake YAMATOLetter <- [A-Za-z]
2123532d591SMasatake YAMATODigit <- [0-9]
2133532d591SMasatake YAMATO
2143532d591SMasatake YAMATO# //
2153532d591SMasatake YAMATO
2163532d591SMasatake YAMATOSourceChar <- .
2173532d591SMasatake YAMATOComment <- MultiLineComment / SingleLineComment
2183532d591SMasatake YAMATOMultiLineComment <- "/*" ( !"*/" SourceChar )* "*/"
2193532d591SMasatake YAMATOMultiLineCommentNoLineTerminator <- "/*" ( !( "*/" / EOL ) SourceChar )* "*/"
2203532d591SMasatake YAMATOSingleLineComment <- ("//" ( !EOL SourceChar )*) / ("#" ( !EOL SourceChar )*)
2213532d591SMasatake YAMATO
2223532d591SMasatake YAMATO__ <- ( Whitespace / EOL / Comment )*
2233532d591SMasatake YAMATO_ <- ( Whitespace / MultiLineCommentNoLineTerminator )*
2243532d591SMasatake YAMATOWS <- Whitespace*
2253532d591SMasatake YAMATO
2263532d591SMasatake YAMATOWhitespace <- [ \t\r]
2273532d591SMasatake YAMATOEOL <- '\n'
2283532d591SMasatake YAMATOEOS <- __ ';' / _ SingleLineComment? EOL / __ EOF
2293532d591SMasatake YAMATO
2303532d591SMasatake YAMATOEOF <- !.
2313532d591SMasatake YAMATO
2323532d591SMasatake YAMATO%%
2333532d591SMasatake YAMATO#include "thrift_post.h"
234