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