xref: /Universal-ctags/peg/varlink.peg (revision b7514e1ec672a8580bea041544e9259a169f09c3)
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