10c014297SMasatake YAMATO# 20c014297SMasatake YAMATO# This file is derived from 30c014297SMasatake YAMATO# 40c014297SMasatake YAMATO# https://github.com/varlink/rust/blob/master/varlink_parser/src/varlink_grammar.rustpeg 50c014297SMasatake YAMATO# 60c014297SMasatake YAMATO# Using the file in MIT License is allowed in https://github.com/varlink/rust/issues/20. 70c014297SMasatake YAMATO# 80c014297SMasatake YAMATO######################################################################## 90c014297SMasatake YAMATO# 100c014297SMasatake YAMATO# MIT License 110c014297SMasatake YAMATO# 120c014297SMasatake YAMATO# Copyright (c) 2016 - 2018 Red Hat, Inc. 130c014297SMasatake YAMATO# 140c014297SMasatake YAMATO# Permission is hereby granted, free of charge, to any person obtaining a copy 150c014297SMasatake YAMATO# of this software and associated documentation files (the "Software"), to deal 160c014297SMasatake YAMATO# in the Software without restriction, including without limitation the rights 170c014297SMasatake YAMATO# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 180c014297SMasatake YAMATO# copies of the Software, and to permit persons to whom the Software is 190c014297SMasatake YAMATO# furnished to do so, subject to the following conditions: 200c014297SMasatake YAMATO# 210c014297SMasatake YAMATO# The above copyright notice and this permission notice shall be included in all 220c014297SMasatake YAMATO# copies or substantial portions of the Software. 230c014297SMasatake YAMATO# 240c014297SMasatake YAMATO# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 250c014297SMasatake YAMATO# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 260c014297SMasatake YAMATO# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 270c014297SMasatake YAMATO# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 280c014297SMasatake YAMATO# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 290c014297SMasatake YAMATO# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 300c014297SMasatake YAMATO# SOFTWARE. 310c014297SMasatake YAMATO# 320c014297SMasatake YAMATO######################################################################## 330c014297SMasatake YAMATO# 340c014297SMasatake YAMATO# This module contains PEG grammer and functions for generating tags 350c014297SMasatake YAMATO# for varlink IDL: 360c014297SMasatake YAMATO# 370c014297SMasatake YAMATO# * https://github.com/varlink 380c014297SMasatake YAMATO# * https://varlink.org/Interface-Definition 390c014297SMasatake YAMATO# 400c014297SMasatake YAMATO# varlink_grammar.rustpeg uses ** and ++ extended operators. 410c014297SMasatake YAMATO# peg processor written in Rust can understand the operators. 420c014297SMasatake YAMATO# However, packcc doesn't do. So ** and ++ are replaced with 430c014297SMasatake YAMATO# rules without ** and ++ operators. 440c014297SMasatake YAMATO# 450c014297SMasatake YAMATO# This parser is the test-bed for using packcc in ctags. 460c014297SMasatake YAMATO# 470c014297SMasatake YAMATO# TODO 480c014297SMasatake YAMATO# 490c014297SMasatake YAMATO# * revise scope field for field value 500c014297SMasatake YAMATO# * implement typeref and signature fields 510c014297SMasatake YAMATO# 520c014297SMasatake YAMATO 530c014297SMasatake YAMATO# 540c014297SMasatake YAMATO# To avoid conflicting names in code generated by packcc and code written manually, 550c014297SMasatake YAMATO# add "p" as prefix to names in generated code. 560c014297SMasatake YAMATO# 570c014297SMasatake YAMATO%prefix "pvarlink" 580c014297SMasatake YAMATO 590c014297SMasatake YAMATO%auxil "struct parserCtx *" 600c014297SMasatake YAMATO 61ae30dd46SJan Dolinar%earlysource { 62ae30dd46SJan Dolinar #include "general.h" 63ae30dd46SJan Dolinar} 64ae30dd46SJan Dolinar 650c014297SMasatake YAMATO%header { 660c014297SMasatake YAMATO struct parserCtx; 670c014297SMasatake YAMATO} 680c014297SMasatake YAMATO 690c014297SMasatake YAMATO%source { 700c014297SMasatake YAMATO#include "varlink_pre.h" 710c014297SMasatake YAMATO} 720c014297SMasatake YAMATO 730c014297SMasatake YAMATO# 74ebdbd8e2SK.Takata# Packcc tries to apply the first grammar rule in the input. 750c014297SMasatake YAMATO# 760c014297SMasatake YAMATOinterface 770c014297SMasatake YAMATO <- _* "interface" _+ interface_name eol ( member_list ) _* 780c014297SMasatake YAMATO 790c014297SMasatake YAMATO# Modeled after ECMA-262, 5th ed., 7.2. \v\f removed 800c014297SMasatake YAMATOwhitespace 810c014297SMasatake YAMATO <- [ \t\u00A0\uFEFF\u1680\u180E\u2000-\u200A\u202F\u205F\u3000] 820c014297SMasatake YAMATO 830c014297SMasatake YAMATO# Modeled after ECMA-262, 5th ed., 7.3. 840c014297SMasatake YAMATOeol_r 850c014297SMasatake YAMATO <- "\n" 860c014297SMasatake YAMATO / "\r\n" 870c014297SMasatake YAMATO / "\r" 880c014297SMasatake YAMATO / "\u2028" 890c014297SMasatake YAMATO / "\u2029" 900c014297SMasatake YAMATO 910c014297SMasatake YAMATOcomment 920c014297SMasatake YAMATO <- "#" [^\n\r\u2028\u2029]* eol_r 930c014297SMasatake YAMATO 940c014297SMasatake YAMATOeol 950c014297SMasatake YAMATO <- whitespace* eol_r 960c014297SMasatake YAMATO / comment 970c014297SMasatake YAMATO 980c014297SMasatake YAMATO_ 990c014297SMasatake YAMATO <- whitespace / comment / eol_r 1000c014297SMasatake YAMATO 1010c014297SMasatake YAMATOfield_name 1020c014297SMasatake YAMATO <- < [A-Za-z]('_'?[A-Za-z0-9])* > { 1033526ccb5SMasatake YAMATO makeVarlinkTag(auxil, $1, $1s); 1040c014297SMasatake YAMATO} 1050c014297SMasatake YAMATO 1060c014297SMasatake YAMATOfield_name_list 1070c014297SMasatake YAMATO <- field_name (_* ',' _* field_name)* 1080c014297SMasatake YAMATO 1090c014297SMasatake YAMATOname 1100c014297SMasatake YAMATO <- < [A-Z][A-Za-z0-9]* > { 111*b7514e1eSMasatake YAMATO if (PEEK_KIND (auxil) != KIND_GHOST_INDEX) 112*b7514e1eSMasatake YAMATO SET_SCOPE(auxil, makeVarlinkTag(auxil, $1, $1s)); 1130c014297SMasatake YAMATO} 1140c014297SMasatake YAMATO 1150c014297SMasatake YAMATOinterface_name 1160c014297SMasatake YAMATO <- < [a-z]([-]* [a-z0-9])* ( '.' [a-z0-9]([-]*[a-z0-9])* )+ > { 117*b7514e1eSMasatake YAMATO SET_SCOPE(auxil, makeVarlinkTag(auxil, $1, $1s)); 1180c014297SMasatake YAMATO} 1190c014297SMasatake YAMATO 1200c014297SMasatake YAMATOdict 1210c014297SMasatake YAMATO <- "[string]" 1220c014297SMasatake YAMATO 1230c014297SMasatake YAMATOarray 1240c014297SMasatake YAMATO <- "[]" 1250c014297SMasatake YAMATO 1260c014297SMasatake YAMATOmaybe 1270c014297SMasatake YAMATO <- "?" 1280c014297SMasatake YAMATO 1290c014297SMasatake YAMATOelement_type 1300c014297SMasatake YAMATO <- "bool" 1310c014297SMasatake YAMATO / "int" 1320c014297SMasatake YAMATO / "float" 1330c014297SMasatake YAMATO / "string" 1340c014297SMasatake YAMATO / "object" 135*b7514e1eSMasatake YAMATO / { PUSH_KIND (auxil, KIND_GHOST_INDEX); } name { POP_KIND (auxil, false); } 1360c014297SMasatake YAMATO / venum 1370c014297SMasatake YAMATO / vstruct 1380c014297SMasatake YAMATO 1390c014297SMasatake YAMATOtype 1400c014297SMasatake YAMATO <- element_type 1410c014297SMasatake YAMATO / maybe element_type 1420c014297SMasatake YAMATO / array type 1430c014297SMasatake YAMATO / dict type 1440c014297SMasatake YAMATO / maybe array type 1450c014297SMasatake YAMATO / maybe dict type 1460c014297SMasatake YAMATO 1470c014297SMasatake YAMATOvenum 148*b7514e1eSMasatake YAMATO <- { PUSH_KIND (auxil, K_ENUMERATION); } '(' _* field_name_list? _* ')' { POP_KIND (auxil, false); } 1490c014297SMasatake YAMATO 1500c014297SMasatake YAMATOargument 1510c014297SMasatake YAMATO <- _* field_name _* ':' _* type 1520c014297SMasatake YAMATO 1530c014297SMasatake YAMATOargument_list 1540c014297SMasatake YAMATO <- argument (_* ',' _* argument)* 1550c014297SMasatake YAMATO 1560c014297SMasatake YAMATOvstruct 157*b7514e1eSMasatake YAMATO <- { pushKindContextual (auxil); } '(' _* argument_list? _* ')' { POP_KIND (auxil, false); } 1580c014297SMasatake YAMATO 1590c014297SMasatake YAMATOvtypedef 160*b7514e1eSMasatake YAMATO <- "type" { PUSH_KIND (auxil, K_STRUCT); } _+ name _* vstruct { POP_KIND (auxil, true); } 161*b7514e1eSMasatake YAMATO / "type" { PUSH_KIND (auxil, K_ENUM); } _+ name _* venum { POP_KIND (auxil, true); } 1620c014297SMasatake YAMATO 1630c014297SMasatake YAMATOerror 164*b7514e1eSMasatake YAMATO <- "error" { PUSH_KIND (auxil, K_ERROR); } _+ name _* vstruct { POP_KIND (auxil, true); } 1650c014297SMasatake YAMATO 1660c014297SMasatake YAMATOmethod 1670c014297SMasatake YAMATO <- "method" { 168*b7514e1eSMasatake YAMATO PUSH_KIND (auxil, K_METHOD); setMethodParamState (auxil, METHOD_PARAM_INPUT); 1690c014297SMasatake YAMATO } _+ name _* vstruct _* { 1700c014297SMasatake YAMATO setMethodParamState (auxil, METHOD_PARAM_OUTPUT); 171*b7514e1eSMasatake YAMATO } "->" _* vstruct { POP_KIND (auxil, true); } 1720c014297SMasatake YAMATO 1730c014297SMasatake YAMATOmember 1740c014297SMasatake YAMATO <- _* m:method 1750c014297SMasatake YAMATO / _* t:vtypedef 1760c014297SMasatake YAMATO / _* e:error 1770c014297SMasatake YAMATO 1780c014297SMasatake YAMATOmember_list 1790c014297SMasatake YAMATO <- member (eol member)* 1800c014297SMasatake YAMATO 1810c014297SMasatake YAMATO%% 1820c014297SMasatake YAMATO#include "varlink_post.h" 183