Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Grammar railroad diagram #344

Open
mingodad opened this issue Sep 23, 2024 · 0 comments
Open

Grammar railroad diagram #344

mingodad opened this issue Sep 23, 2024 · 0 comments

Comments

@mingodad
Copy link

I've just added this project grammar to https://mingodad.github.io/parsertl-playground/playground/ an Yacc/Lex compatible online editor/tester (select Protocompile parser from Examples then click Parse to see a parse tree for the content in Input Source), it also generate an EBNF understood by (IPV4) https://rr.red-dove.com/ui or (IPV6) https://www.bottlecaps.de/rr/ui to generate a nice navigable railroad diagram (see instruction bellow at the top).

I hope it can help develop/debug/document this project grammar.

//
// EBNF to be viewd at
//    (IPV6) https://www.bottlecaps.de/rr/ui
//    (IPV4) https://rr.red-dove.com/ui
//
// Copy and paste this at one of the urls shown above in the 'Edit Grammar' tab
// then click the 'View Diagram' tab.
//

file::=
	  syntaxDecl
	| editionDecl
	| fileBody
	| syntaxDecl fileBody
	| editionDecl fileBody
	| /*%empty*/

fileBody::=
	  semicolons fileElements

fileElements::=
	  fileElements fileElement
	| fileElement

fileElement::=
	  importDecl
	| packageDecl
	| optionDecl
	| messageDecl
	| enumDecl
	| extensionDecl
	| serviceDecl

semicolonList::=
	  ';'
	| semicolonList ';'

semicolons::=
	  semicolonList
	| /*%empty*/

semicolon::=
	  ';'
	| /*%empty*/

syntaxDecl::=
	  _SYNTAX '=' stringLit ';'

editionDecl::=
	  _EDITION '=' stringLit ';'

importDecl::=
	  _IMPORT stringLit semicolons
	| _IMPORT _WEAK stringLit semicolons
	| _IMPORT _PUBLIC stringLit semicolons

packageDecl::=
	  _PACKAGE qualifiedIdentifier semicolons

qualifiedIdentifier::=
	  identifier
	| qualifiedIdentifier '.' identifier

qualifiedIdentifierDot::=
	  qualifiedIdentifierFinal
	| qualifiedIdentifierLeading qualifiedIdentifierFinal

qualifiedIdentifierLeading::=
	  qualifiedIdentifierEntry
	| qualifiedIdentifierLeading qualifiedIdentifierEntry

qualifiedIdentifierFinal::=
	  identifier
	| qualifiedIdentifierEntry

qualifiedIdentifierEntry::=
	  identifier '.'

msgElementIdent::=
	  msgElementName
	| msgElementIdent '.' identifier

extElementIdent::=
	  extElementName
	| extElementIdent '.' identifier

oneofElementIdent::=
	  oneofElementName
	| oneofElementIdent '.' identifier

notGroupElementIdent::=
	  notGroupElementName
	| notGroupElementIdent '.' identifier

mtdElementIdent::=
	  mtdElementIdentFinal
	| mtdElementIdentLeading mtdElementIdentFinal

mtdElementIdentLeading::=
	  mtdElementIdentEntry
	| mtdElementIdentLeading mtdElementIdentEntry

mtdElementIdentFinal::=
	  mtdElementName
	| mtdElementIdentEntry

mtdElementIdentEntry::=
	  mtdElementName '.'

oneofOptionDecl::=
	  _OPTION optionName '=' optionValue semicolon

optionDecl::=
	  _OPTION optionName '=' optionValue semicolons

optionNamePart::=
	  identifier
	| extensionName

optionNameEntry::=
	  optionNamePart '.'

optionNameFinal::=
	  optionNamePart
	| optionNameEntry

optionNameLeading::=
	  optionNameEntry
	| optionNameLeading optionNameEntry

optionName::=
	  optionNameFinal
	| optionNameLeading optionNameFinal

extensionName::=
	  '(' typeName ')'

optionValue::=
	  scalarValue
	| messageLiteralWithBraces

scalarValue::=
	  stringLit
	| numLit
	| specialFloatLit
	| identifier

numLit::=
	  _FLOAT_LIT
	| '-' _FLOAT_LIT
	| _INT_LIT
	| '-' _INT_LIT

specialFloatLit::=
	  '-' _INF
	| '-' _NAN

stringLit::=
	  _STRING_LIT
	| stringLit _STRING_LIT

messageLiteralWithBraces::=
	  '{' messageTextFormat '}'
	| '{' '}'

messageTextFormat::=
	  messageLiteralFields

messageLiteralFields::=
	  messageLiteralFieldEntry
	| messageLiteralFieldEntry messageLiteralFields

messageLiteralFieldEntry::=
	  messageLiteralField
	| messageLiteralField ','
	| messageLiteralField ';'

messageLiteralField::=
	  messageLiteralFieldName ':' fieldValue
	| messageLiteralFieldName messageValue

messageLiteralFieldName::=
	  identifier
	| '[' qualifiedIdentifierDot ']'
	| '[' qualifiedIdentifierDot '/' qualifiedIdentifierDot ']'

fieldValue::=
	  fieldScalarValue
	| messageLiteral
	| listLiteral

fieldScalarValue::=
	  stringLit
	| numLit
	| '-' identifier
	| identifier

messageValue::=
	  messageLiteral
	| listOfMessagesLiteral

messageLiteral::=
	  messageLiteralWithBraces
	| '<' messageTextFormat '>'
	| '<' '>'

listLiteral::=
	  '[' listElements ']'
	| '[' ']'

listElements::=
	  listElement
	| listElements ',' listElement

listElement::=
	  fieldScalarValue
	| messageLiteral

listOfMessagesLiteral::=
	  '[' messageLiterals ']'
	| '[' ']'

messageLiterals::=
	  messageLiteral
	| messageLiterals ',' messageLiteral

typeName::=
	  qualifiedIdentifierDot
	| '.' qualifiedIdentifierDot

msgElementTypeIdent::=
	  msgElementIdent
	| '.' qualifiedIdentifier

extElementTypeIdent::=
	  extElementIdent
	| '.' qualifiedIdentifier

oneofElementTypeIdent::=
	  oneofElementIdent
	| '.' qualifiedIdentifier

notGroupElementTypeIdent::=
	  notGroupElementIdent
	| '.' qualifiedIdentifier

mtdElementTypeIdent::=
	  mtdElementIdent
	| '.' qualifiedIdentifierDot

fieldCardinality::=
	  _REQUIRED
	| _OPTIONAL
	| _REPEATED

compactOptions::=
	  '[' compactOptionDecls ']'
	| '[' ']'

compactOptionDecls::=
	  compactOptionFinal
	| compactOptionLeadingDecls compactOptionFinal

compactOptionLeadingDecls::=
	  compactOptionEntry
	| compactOptionLeadingDecls compactOptionEntry

compactOptionFinal::=
	  compactOption
	| compactOptionEntry

compactOptionEntry::=
	  compactOption ','

compactOption::=
	  optionName '=' optionValue
	| optionName

groupDecl::=
	  fieldCardinality _GROUP identifier '=' _INT_LIT '{' messageBody '}'
	| fieldCardinality _GROUP identifier '=' _INT_LIT compactOptions '{' messageBody '}'

messageGroupDecl::=
	  fieldCardinality _GROUP identifier '=' _INT_LIT '{' messageBody '}' semicolons
	| fieldCardinality _GROUP identifier '=' _INT_LIT compactOptions '{' messageBody '}' semicolons
	| fieldCardinality _GROUP identifier '{' messageBody '}' semicolons
	| fieldCardinality _GROUP identifier compactOptions '{' messageBody '}' semicolons

oneofDecl::=
	  _ONEOF identifier '{' oneofBody '}' semicolons

oneofBody::=
	  /*%empty*/
	| oneofElements

oneofElements::=
	  oneofElements oneofElement
	| oneofElement

oneofElement::=
	  oneofOptionDecl
	| oneofFieldDecl
	| oneofGroupDecl

oneofFieldDecl::=
	  oneofElementTypeIdent identifier '=' _INT_LIT semicolon
	| oneofElementTypeIdent identifier '=' _INT_LIT compactOptions semicolon
	| oneofElementTypeIdent identifier semicolon
	| oneofElementTypeIdent identifier compactOptions semicolon

oneofGroupDecl::=
	  _GROUP identifier '=' _INT_LIT '{' messageBody '}'
	| _GROUP identifier '=' _INT_LIT compactOptions '{' messageBody '}'
	| _GROUP identifier '{' messageBody '}'
	| _GROUP identifier compactOptions '{' messageBody '}'

mapFieldDecl::=
	  mapType identifier '=' _INT_LIT semicolons
	| mapType identifier '=' _INT_LIT compactOptions semicolons
	| mapType identifier semicolons
	| mapType identifier compactOptions semicolons

mapType::=
	  _MAP '<' mapKeyType ',' typeName '>'

mapKeyType::=
	  _INT32
	| _INT64
	| _UINT32
	| _UINT64
	| _SINT32
	| _SINT64
	| _FIXED32
	| _FIXED64
	| _SFIXED32
	| _SFIXED64
	| _BOOL
	| _STRING

extensionRangeDecl::=
	  _EXTENSIONS tagRanges ';' semicolons
	| _EXTENSIONS tagRanges compactOptions semicolons

tagRanges::=
	  tagRange
	| tagRanges ',' tagRange

tagRange::=
	  _INT_LIT
	| _INT_LIT _TO _INT_LIT
	| _INT_LIT _TO _MAX

enumValueRanges::=
	  enumValueRange
	| enumValueRanges ',' enumValueRange

enumValueRange::=
	  enumValueNumber
	| enumValueNumber _TO enumValueNumber
	| enumValueNumber _TO _MAX

enumValueNumber::=
	  _INT_LIT
	| '-' _INT_LIT

msgReserved::=
	  _RESERVED tagRanges ';' semicolons
	| reservedNames

enumReserved::=
	  _RESERVED enumValueRanges ';' semicolons
	| reservedNames

reservedNames::=
	  _RESERVED fieldNameStrings semicolons
	| _RESERVED fieldNameIdents semicolons

fieldNameStrings::=
	  stringLit
	| fieldNameStrings ',' stringLit

fieldNameIdents::=
	  identifier
	| fieldNameIdents ',' identifier

enumDecl::=
	  _ENUM identifier '{' enumBody '}' semicolons

enumBody::=
	  semicolons
	| semicolons enumElements

enumElements::=
	  enumElements enumElement
	| enumElement

enumElement::=
	  optionDecl
	| enumValueDecl
	| enumReserved

enumValueDecl::=
	  enumValueName '=' enumValueNumber semicolons
	| enumValueName '=' enumValueNumber compactOptions semicolons

messageDecl::=
	  _MESSAGE identifier '{' messageBody '}' semicolons

messageBody::=
	  semicolons
	| semicolons messageElements

messageElements::=
	  messageElements messageElement
	| messageElement

messageElement::=
	  messageFieldDecl
	| enumDecl
	| messageDecl
	| extensionDecl
	| extensionRangeDecl
	| messageGroupDecl
	| optionDecl
	| oneofDecl
	| mapFieldDecl
	| msgReserved

messageFieldDecl::=
	  fieldCardinality notGroupElementTypeIdent identifier '=' _INT_LIT semicolons
	| fieldCardinality notGroupElementTypeIdent identifier '=' _INT_LIT compactOptions semicolons
	| msgElementTypeIdent identifier '=' _INT_LIT semicolons
	| msgElementTypeIdent identifier '=' _INT_LIT compactOptions semicolons
	| fieldCardinality notGroupElementTypeIdent identifier semicolons
	| fieldCardinality notGroupElementTypeIdent identifier compactOptions semicolons
	| msgElementTypeIdent identifier semicolons
	| msgElementTypeIdent identifier compactOptions semicolons

extensionDecl::=
	  _EXTEND typeName '{' extensionBody '}' semicolons

extensionBody::=
	  /*%empty*/
	| extensionElements

extensionElements::=
	  extensionElements extensionElement
	| extensionElement

extensionElement::=
	  extensionFieldDecl
	| groupDecl

extensionFieldDecl::=
	  fieldCardinality notGroupElementTypeIdent identifier '=' _INT_LIT semicolon
	| fieldCardinality notGroupElementTypeIdent identifier '=' _INT_LIT compactOptions semicolon
	| extElementTypeIdent identifier '=' _INT_LIT semicolon
	| extElementTypeIdent identifier '=' _INT_LIT compactOptions semicolon

serviceDecl::=
	  _SERVICE identifier '{' serviceBody '}' semicolons

serviceBody::=
	  semicolons
	| semicolons serviceElements

serviceElements::=
	  serviceElements serviceElement
	| serviceElement

serviceElement::=
	  optionDecl
	| methodDecl

methodDecl::=
	  _RPC identifier methodMessageType _RETURNS methodMessageType semicolons
	| _RPC identifier methodMessageType _RETURNS methodMessageType '{' methodBody '}' semicolons

methodMessageType::=
	  '(' _STREAM typeName ')'
	| '(' mtdElementTypeIdent ')'

methodBody::=
	  semicolons
	| semicolons methodElements

methodElements::=
	  methodElements methodElement
	| methodElement

methodElement::=
	  optionDecl

msgElementName::=
	  _NAME
	| _SYNTAX
	| _EDITION
	| _IMPORT
	| _WEAK
	| _PUBLIC
	| _PACKAGE
	| _TRUE
	| _FALSE
	| _INF
	| _NAN
	| _DOUBLE
	| _FLOAT
	| _INT32
	| _INT64
	| _UINT32
	| _UINT64
	| _SINT32
	| _SINT64
	| _FIXED32
	| _FIXED64
	| _SFIXED32
	| _SFIXED64
	| _BOOL
	| _STRING
	| _BYTES
	| _MAP
	| _TO
	| _MAX
	| _SERVICE
	| _RPC
	| _STREAM
	| _RETURNS

extElementName::=
	  _NAME
	| _SYNTAX
	| _EDITION
	| _IMPORT
	| _WEAK
	| _PUBLIC
	| _PACKAGE
	| _OPTION
	| _TRUE
	| _FALSE
	| _INF
	| _NAN
	| _DOUBLE
	| _FLOAT
	| _INT32
	| _INT64
	| _UINT32
	| _UINT64
	| _SINT32
	| _SINT64
	| _FIXED32
	| _FIXED64
	| _SFIXED32
	| _SFIXED64
	| _BOOL
	| _STRING
	| _BYTES
	| _ONEOF
	| _MAP
	| _EXTENSIONS
	| _TO
	| _MAX
	| _RESERVED
	| _ENUM
	| _MESSAGE
	| _EXTEND
	| _SERVICE
	| _RPC
	| _STREAM
	| _RETURNS

enumValueName::=
	  _NAME
	| _SYNTAX
	| _EDITION
	| _IMPORT
	| _WEAK
	| _PUBLIC
	| _PACKAGE
	| _TRUE
	| _FALSE
	| _INF
	| _NAN
	| _REPEATED
	| _OPTIONAL
	| _REQUIRED
	| _DOUBLE
	| _FLOAT
	| _INT32
	| _INT64
	| _UINT32
	| _UINT64
	| _SINT32
	| _SINT64
	| _FIXED32
	| _FIXED64
	| _SFIXED32
	| _SFIXED64
	| _BOOL
	| _STRING
	| _BYTES
	| _GROUP
	| _ONEOF
	| _MAP
	| _EXTENSIONS
	| _TO
	| _MAX
	| _ENUM
	| _MESSAGE
	| _EXTEND
	| _SERVICE
	| _RPC
	| _STREAM
	| _RETURNS

oneofElementName::=
	  _NAME
	| _SYNTAX
	| _EDITION
	| _IMPORT
	| _WEAK
	| _PUBLIC
	| _PACKAGE
	| _TRUE
	| _FALSE
	| _INF
	| _NAN
	| _DOUBLE
	| _FLOAT
	| _INT32
	| _INT64
	| _UINT32
	| _UINT64
	| _SINT32
	| _SINT64
	| _FIXED32
	| _FIXED64
	| _SFIXED32
	| _SFIXED64
	| _BOOL
	| _STRING
	| _BYTES
	| _ONEOF
	| _MAP
	| _EXTENSIONS
	| _TO
	| _MAX
	| _RESERVED
	| _ENUM
	| _MESSAGE
	| _EXTEND
	| _SERVICE
	| _RPC
	| _STREAM
	| _RETURNS

notGroupElementName::=
	  _NAME
	| _SYNTAX
	| _EDITION
	| _IMPORT
	| _WEAK
	| _PUBLIC
	| _PACKAGE
	| _OPTION
	| _TRUE
	| _FALSE
	| _INF
	| _NAN
	| _REPEATED
	| _OPTIONAL
	| _REQUIRED
	| _DOUBLE
	| _FLOAT
	| _INT32
	| _INT64
	| _UINT32
	| _UINT64
	| _SINT32
	| _SINT64
	| _FIXED32
	| _FIXED64
	| _SFIXED32
	| _SFIXED64
	| _BOOL
	| _STRING
	| _BYTES
	| _ONEOF
	| _MAP
	| _EXTENSIONS
	| _TO
	| _MAX
	| _RESERVED
	| _ENUM
	| _MESSAGE
	| _EXTEND
	| _SERVICE
	| _RPC
	| _STREAM
	| _RETURNS

mtdElementName::=
	  _NAME
	| _SYNTAX
	| _EDITION
	| _IMPORT
	| _WEAK
	| _PUBLIC
	| _PACKAGE
	| _OPTION
	| _TRUE
	| _FALSE
	| _INF
	| _NAN
	| _REPEATED
	| _OPTIONAL
	| _REQUIRED
	| _DOUBLE
	| _FLOAT
	| _INT32
	| _INT64
	| _UINT32
	| _UINT64
	| _SINT32
	| _SINT64
	| _FIXED32
	| _FIXED64
	| _SFIXED32
	| _SFIXED64
	| _BOOL
	| _STRING
	| _BYTES
	| _GROUP
	| _ONEOF
	| _MAP
	| _EXTENSIONS
	| _TO
	| _MAX
	| _RESERVED
	| _ENUM
	| _MESSAGE
	| _EXTEND
	| _SERVICE
	| _RPC
	| _RETURNS

identifier::=
	  _NAME
	| _SYNTAX
	| _EDITION
	| _IMPORT
	| _WEAK
	| _PUBLIC
	| _PACKAGE
	| _OPTION
	| _TRUE
	| _FALSE
	| _INF
	| _NAN
	| _REPEATED
	| _OPTIONAL
	| _REQUIRED
	| _DOUBLE
	| _FLOAT
	| _INT32
	| _INT64
	| _UINT32
	| _UINT64
	| _SINT32
	| _SINT64
	| _FIXED32
	| _FIXED64
	| _SFIXED32
	| _SFIXED64
	| _BOOL
	| _STRING
	| _BYTES
	| _GROUP
	| _ONEOF
	| _MAP
	| _EXTENSIONS
	| _TO
	| _MAX
	| _RESERVED
	| _ENUM
	| _MESSAGE
	| _EXTEND
	| _SERVICE
	| _RPC
	| _STREAM
	| _RETURNS

//Tokens

_BOOL ::= "bool"
_BYTES ::= "bytes"
_DOUBLE ::= "double"
_EDITION ::= "edition"
_ENUM ::= "enum"
_EXTEND ::= "extend"
_EXTENSIONS ::= "extensions"
_FALSE ::= "false"
_FIXED32 ::= "fixed32"
_FIXED64 ::= "fixed64"
_FLOAT ::= "float"
_GROUP ::= "group"
_IMPORT ::= "import"
_INF ::= "inf"
_INT32 ::= "int32"
_INT64 ::= "int64"
_MAP ::= "map"
_MAX ::= "max"
_MESSAGE ::= "message"
_NAN ::= "nan"
_ONEOF ::= "oneof"
_OPTIONAL ::= "optional"
_OPTION ::= "option"
_PACKAGE ::= "package"
_PUBLIC ::= "public"
_REPEATED ::= "repeated"
_REQUIRED ::= "required"
_RESERVED ::= "reserved"
_RETURNS ::= "returns"
_RPC ::= "rpc"
_SERVICE ::= "service"
_SFIXED32 ::= "sfixed32"
_SFIXED64 ::= "sfixed64"
_SINT32 ::= "sint32"
_SINT64 ::= "sint64"
_STREAM ::= "stream"
_STRING ::= "string"
_SYNTAX ::= "syntax"
_TO ::= "to"
_TRUE ::= "true"
_UINT32 ::= "uint32"
_UINT64 ::= "uint64"
_WEAK ::= "weak"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant