Грамматика языка программирования Libretto

Дата и время генерации этого документа: 2025-01-17 21:04:19

Правила

Правила даны в синтаксисе грамматики, разбирающей выражение (см. википедию о PEG). ANY, MATCH, EOI - это предопределенные правила.

PartsFirstLineComment? Packages EOI
Packages("package" AfterWord PackageName)? Globals?
GlobalsSep? UseP* (Global (Sep Global)*)? Sep? OtherPackages*
OtherPackages"package" AfterWord PackageName Sep UseP* (Global (Sep Global)*)? Sep?
GlobalStructureP / Method / UnionP / TraitP / UnfoldMethod
UseP"use" AfterWord PackageName ("as" AfterWord LocalNameString)? Sep
KindContextKind
Method"def" AfterWord (('~' LocalName) / (KindContext LocalName) / (MATCH LocalName)) Params? ColonType '=' Expression
KindNewContextKindNew
UnfoldMethod"unfold" AfterWord "def" AfterWord KindNewContext LocalName ParamsNew? ColonTypeNew '=' Expression
UnionP"union" AfterWord LocalName '=' (Kind (( '|' ) Kind)*)
TraitP"trait" AfterWord LocalName ('[' (LocalName ((',' ) LocalName)*) ']' )? TraitBody?
TraitBody'{' (TraitMethod (Sep TraitMethod)*)? Sep? '}'
TraitMethod("def" AfterWord)? LocalName Params? ColonType
StructureP"struct" AfterWord LocalName ('[' (LocalName ((',' ) LocalName)*) ']' )? (StructureBody1 / StructureBody2)?
StructureBody1'(' (StructureField1 (( ',' ) StructureField1)*) ')'
StructureBody2'{' (StructureField2 (Sep StructureField2)*)? Sep? '}'
StructureField1LocalNameTypeBase
StructureField2("fix" AfterWord)? LocalNameTypeBase
Param('#' (':' Name)? VarLocalName) / (VarLocalNameTypeBase ('=' Expression)?)
Params'(' (Param (( ',' ) Param)*)? ')'
ParamsNew'(' (Param (( ',' ) Param)*) ')'
ParamsN('(' (Param (( ',' ) Param)*) ')' ) / MATCH
DefVarFixExpression("fix" AfterWord VarLocalNameTypeBase '=' Expression) / ("var" AfterWord VarLocalNameTypeBase ('=' Expression)?) / ("def" AfterWord VarLocalName ParamsN ColonType '=' Expression)
Partial'{' (CaseP (Sep CaseP)*) '}'
CaseP"case" AfterWord Pattern ("if" AfterWord Expression)? "=>" Expression
PatternExprBlock / PatternLiteral / TraitPattern / VarPattern
VarPattern('_' ) / VarLocalName
TraitPatternVarLocalName ':' Name
SwitchContextExprCaseList
SwitchCaseList Block*
CaseList'{' (SwitchCase (Sep SwitchCase)*) (Sep CaseElse)? '}'
CaseElse"else" AfterWord '='
SwitchOld'{' (SwitchCaseOld (Sep SwitchCaseOld)*) (Sep CaseElseOld)? '}' Block*
CaseElseOld"else" AfterWord "=>"
SwitchSimpleSwitchCaseCaseOld ( SwitchCaseElseOld)?
SwitchCaseSwitchCaseElse / SwitchCaseCase
SwitchCaseOldSwitchCaseElseOld / SwitchCaseCaseOld
SwitchCaseElse"else" AfterWord '=' Expression
SwitchCaseElseOld"else" AfterWord "=>"? Expression
SwitchCaseCase"case" AfterWord SwitchPattern ("if" AfterWord '(' Expression ')' )? '=' Expression
SwitchCaseCaseOld"case" AfterWord SwitchPatternOld ("if" AfterWord Expression)? "=>" Expression
SwitchPatternSwitchEmpty / SwitchNonEmpty / SwitchVar / SwitchExpr
SwitchPatternOldSwitchEmpty / SwitchNonEmptyOld / SwitchVarOld / SwitchExpr
SwitchVar(VarLocalName MandatoryColonType) / ('~' MandatoryColonType)
SwitchVarOldVarLocalNameOptTypeBase
SwitchExprExprBlock
SwitchEmpty"()"
SwitchNonEmpty'(' (VarLocalName / ('~' )) ')'
SwitchNonEmptyOld'(' VarLocalName ')'
ExpressionReturnExpr / TopExpression
ReturnExpr"return" AfterWord TopExpression
TopExpressionInfix
InfixOr (NameWithoutSpace RequiredSpaceNl Or)*
OrAnd ((("or" AfterWord) / ('∨' )) And)*
AndNot ((("and" AfterWord) / ('∧' )) Not)*
Not((("not" AfterWord) / ('¬' )) Not) / Compare
CompareSum (("==" Sum) / ("!=" Sum) / (">=" Sum) / ('>' Sum) / ("<=" Sum) / ('<' Sum) / ("in" AfterWord Sum))*
SumMult (('+' Mult) / ('-' !'-' Mult))*
MultCompoundExpr (('*' CompoundExpr) / ("mod" AfterWord CompoundExpr) / ("div" AfterWord CompoundExpr) / ("idiv" AfterWord CompoundExpr))*
CompoundExprIfExpr / Path
IfExpr"if" AfterWord '(' Expression ')' (("as" AfterWord VarLocalName ExprBlock ( "else" AfterWord Expression)?) / (Expression ( "else" AfterWord Expression)?))
Path(DotPathStep ('.' PathStep)*) / (PathStep (('.' ) PathStep)*)
DotPathStep'.' NameOrCallNew AsBlock?
PathStepEmptyStep / OrderStep / GroupStep / IndexStep / BaseAndUpdatePathStep
EmptyStep'?' Seq
OrderStep"^(" (SubOrder ((',' ) SubOrder)*)? ')' Block*
SubOrder(("asc" AfterWord) / ("desc" AfterWord))? Expression
GroupStep'*' (Switch / SwitchOld / SwitchSimple / (NameOrCall Block*))
IndexValue(Negative? ".." Negative?) / Expression
IndexStep'[' IndexValue ']' Block*
BaseAndUpdatePathStepBasePathStep (('=' Expression) / ("+=" Expression) / (".=" Expression))?
BasePathStepStepExpr Block*
StepExprIfExpr / ReturnExpr / (EnumExpr Apply*)
ColonArg':' Expression
Apply'!' !'=' ApplyArg
ApplyArgApplyArgExpr / ('(' (Expression (( ',' ) Expression)*)? ')' )?
ApplyArgExprStringTemplate / NewTrait / NameParametricOpt / Literal / Meta / ContextOrThis / Xml
EnumExprNegative (".." Negative)?
Negative('-' SimpleExpr) / SimpleExpr
SimpleExprSwitchContextExpr / Partial / ExprBlock / ContextedExpr / Seq / Meta / Xml / ClassExpr / StringTemplate / NewTrait / NameOrCall / LiteralAll
NameOrCallNameExpr ('[' (SpecifiedType ((',' ) SpecifiedType)*) ']' )? ((('(' (Expression (( ',' ) Expression)*)? ')' ( ColonArg)?) / ColonArg) )?
NameOrCallNewNameExpr ('[' (SpecifiedTypeNew ((',' ) SpecifiedTypeNew)*) ']' )? ((('(' (Expression (( ',' ) Expression)*)? ')' ( ColonArg)?) / ColonArg) )?
NameParametricOptNameExpr ('[' (SpecifiedType ((',' ) SpecifiedType)*) ']' )?
ClassExpr'?' Name
Block("as" AfterWord VarLocalName) / ("index" AfterWord LocalName)
AsBlock"as" AfterWord VarLocalName
ContextedExpr'$' (('{' ((DefVarFixExpression / Expression) (Sep (DefVarFixExpression / Expression))*)? Sep? '}' ) / (MATCH ))
ContextBlock"${" ((DefVarFixExpression / Expression) (Sep (DefVarFixExpression / Expression))*)? Sep? '}'
ExprBlockExprBlockNoTailSpace
ExprBlockNoTailSpace'{' ((DefVarFixExpression / Expression) (Sep (DefVarFixExpression / Expression))*)? Sep? '}'
SeqSeqNoTailSpace
SeqNoTailSpace'(' (Expression (( ',' ) Expression)*)? ')'
LiteralIntegerOrRealOrExpExpr / String / CharOrSymbolExpr / UnitLiteral
LiteralAllIntegerOrRealOrExpExpr / String / CharOrSymbolExpr / ("unit" ) / ("this" )
PatternLiteralExpLiteralSigned / SignedReal / SignedInteger / String / Symbol / UnitLiteral
UnitLiteral"unit"
NameExprName / ('!' )
ContextOrThis('$' / "this")
Meta'#' (( (':' Name)? Params? ExprBlock) / GeneralType)
NewTrait"new" AfterWord WrapperSignature? '{' (WrapperMethod (Sep WrapperMethod)*)? Sep? '}'
WrapperSignature(ParametricKind / Name) ('(' Expression ')' )?
WrapperMethod"def" AfterWord LocalName Params? ColonType '=' Expression
LocalNameTypeBaseLocalName ColonType
VarLocalNameTypeBaseVarLocalName ColonType
VarLocalNameOptTypeBase(VarLocalName / ('_' )) ColonType
ColonType(':' (EmptyType / NothingType / GeneralType)) / CardOnlyTypeSemi /
ColonTypeNew(':' (EmptyType / NothingType / GeneralType)) /
MandatoryColonType':' (EmptyType / NothingType / GeneralType)
SpecifiedTypeEmptyType / NothingType / OfType / OrType / KindType
SpecifiedTypeNewEmptyType / NothingType / OrType / KindTypeNew
GeneralTypeOfType / OrType / KindType / FreeType
EmptyType"()"
NothingType'-'
OfType("typeof" / "type") '(' Expression ')'
KindTypeKind Card
KindTypeNewKindNew SpecifiedCardNew
OrType"general" '(' SpecifiedTypeNew ',' SpecifiedTypeNew ')'
FreeType'~' Card
CardOnlyTypeSemiSignedCardSemi
KindUnionKind / ParametricKind / Name
KindNewUnionKindNew / ParametricKindNew / Name
ParametricKindName '[' (SpecifiedType ((',' ) SpecifiedType)*) ']'
ParametricKindNewName '[' (SpecifiedTypeNew ((',' ) SpecifiedTypeNew)*) ']'
UnionKind'(' (Kind (('|' ) Kind)*) ')'
UnionKindNew'(' (KindNew (('|' ) KindNew)*) ')'
Card('~' ) / SpecifiedCard
SpecifiedCard('*' / '?' / '+' / '!')
SpecifiedCardNew('*' / '?' / '+')
SignedCardSemi('*' / '?' / '+' / '~' / '!')
SignedCardStrict('*' / '?' / '+' / '!')
Xml(XmlElement / XmlComment)
XmlElement'<' XmlPName XmlAttribute* (('>' XmlContents "</" XmlPName '>') / "/>")
XmlAttributeXmlPName '=' (('\"' (!('\"' / '\r' / '\n') AnyChar)* '\"' ) / ('\'' (!('\'' / '\r' / '\n') AnyChar)* '\'' ) / (XmlMetaAttr ))
XmlComment"<!--" XmlCommentText "-->"
XmlCommentText(!"-->" AnyChar)*
XmlText(!('<' / "#{") AnyChar)+
XmlMeta'#' XmlExpr
XmlMetaAttr'#' (XmlExpr / XmlSeq / XmlCall / XmlNamed)
XmlExprExprBlockNoTailSpace
XmlSeqSeqNoTailSpace
XmlNamedName ';'
XmlCallName '(' (Expression ((',' ) Expression)*)? ')'
XmlContents(XmlElement / XmlComment / XmlMeta / XmlText)*
XmlPName(XmlName ':')? XmlName
XmlFirstLetter7Bit[a-z] / [A-Z]
XmlLetter7BitXmlFirstLetter7Bit / [0-9] / '-' / '.'
XmlFirstLetterXmlFirstLetter7Bit / [Ѐ-ӿ]
XmlLetterXmlLetter7Bit / [Ѐ-ӿ]
XmlName(XmlFirstLetter XmlLetter*)
JsonTemplateBodyJsonObject / JsonArray
JsonObject'{' ((JsonPair ) ((',' ) (JsonPair ))*)? '}'
JsonPairJsonString ':' JsonValue
JsonArray'[' ((JsonValue ) ((',' ) (JsonValue ))*)? ']'
JsonStringString / Symbol
JsonIntSignedInteger
JsonRealSignedReal
JsonTrue"true"
JsonFalse"false"
JsonNull"null"
JsonExpLiteralExpLiteralSigned
JsonExpr'#' ExprBlockNoTailSpace
JsonValueJsonObject / JsonArray / JsonExpr / JsonString / JsonTrue / JsonFalse / JsonNull / JsonExpLiteral / JsonReal / JsonInt
SignedInteger'-'? (("0x" (Hex+ ('_' Hex+)*)) / ("0b" (Bin+ ('_' Bin+)*)) / Digits)
IntegerOrRealOrExpExpr(("0x" (Hex+ ('_' Hex+)*)) / ("0b" (Bin+ ('_' Bin+)*)) / (Digits (('.' Digits (EPart / MATCH)) / EPart / MATCH)))
EPart('e' / 'E') '-'? Digits
SignedReal'-'? Digits '.' Digits
DigitsDec+ ('_' Dec+)*
ExpLiteralSigned'-'? Digits ('.' Digits)? EPart
CharOrSymbolExpr'\'' (((('\\' Escaped) / (HighSurrogate LowSurrogate) / (!('\\' / '\'' / '\n' / '\r') AnyChar)) '\'' ) / (NameChars ))
Char'\'' (('\\' Escaped) / (HighSurrogate LowSurrogate) / (!('\\' / '\'' / '\n' / '\r') AnyChar)) '\''
Symbol'\'' NameChars
HighSurrogate[?-?]
LowSurrogate[?-?]
Escaped'\\' / '\"' / '\'' / 'b' / 'n' / 'f' / 'r' / 't' / ('u' Hex Hex Hex Hex) / ("u{" Hex+ '}')
String(DString / NestedString)
DString'\"' (('\\' Escaped) / (!('\\' / '\"' / '\n' / '\r') AnyChar))* '\"'
NestedStringNestedStringA / NestedStringB / NestedStringC / NestedStringD
NestedStringOpen"<<" / '«' / '‘' / '“'
NestedStringA'«' ((!(NestedStringOpen / '»') AnyChar) / NestedString)* '»'
NestedStringB'‘' ((!(NestedStringOpen / '’') AnyChar) / NestedString)* '’'
NestedStringC'“' ((!(NestedStringOpen / '”') AnyChar) / NestedString)* '”'
NestedStringD"<<" ((!(NestedStringOpen / ">>") AnyChar) / NestedString)* ">>"
StringTextContent0(!("#{" / ">>") AnyChar)+
StringTextContent1(('\\' Escaped) / (!("#{" / ('\\' / '\"' / '\n' / '\r')) AnyChar))+
StringExpr'#' ExprBlockNoTailSpace
StringTemplate(("s<<" (StringExpr / StringTextContent0)* ">>") / ("s\"" (StringExpr / StringTextContent1)* '\"') / ("json\"" JsonTemplateBody '\"') / WrongTemplate)
StringTemplateStrict(("s<<" (StringExpr / StringTextContent0)* ">>") / ("s\"" (StringExpr / StringTextContent1)* '\"') / ("json\"" JsonTemplateBody '\"'))
WrongTemplate!("s<<" / "s\"" / "json\"") NameChars ('\"' / "<<")
Bin'0' / '1'
Dec[0-9]
Hex[0-9] / [a-f] / [A-F]
NameFirstLetter7Bit[a-z] / [A-Z] / '@'
NameLetter7BitNameFirstLetter7Bit / [0-9] / '_'
NameFirstLetterNameFirstLetter7Bit / [Ѐ-ӿ]
NameLetterNameLetter7Bit / [Ѐ-ӿ]
NameCharsNameFirstLetter NameLetter*
NameCharsValidNameChars
BacktickedPart'`' (!('`' / '/') AnyChar)+ '`'
NamePartWithoutSpaceBacktickedPart / NameCharsValid
NamePart(BacktickedPart / NameCharsValid)
NamePartStrictWithoutSpaceBacktickedPart / NameChars
LocalNameStringNamePartStrictWithoutSpace
LocalNameNamePartStrictWithoutSpace
VarLocalName(BacktickedPart / ('~'? NameChars))
PackageNameNamePart (('/' ) NamePart)*
NameNamePart ('/' NamePart)?
NameWithoutSpaceNamePartWithoutSpace ( '/' NamePartWithoutSpace)?
AnyChar!('U+061C (ALM)' / 'U+200E (LRM)' / 'U+200F (RLM)' / 'U+202A (LRE)' / 'U+202B (RLE)' / 'U+202C (PDF)' / 'U+202D (LRO)' / 'U+202E (RLO)' / 'U+2066 (LRI)' / 'U+2067 (RLI)' / 'U+2068 (FSI)' / 'U+2069 (PDI)') ANY
FirstLineComment'#' (!Nl AnyChar)*
NestedComment"/*" (NestedComment / (!("/*" / "*/") AnyChar))* "*/"
Comment'/' (('/' (!Nl AnyChar)*) / ('*' (NestedComment / (!("/*" / "*/") AnyChar))* "*/"))
(Comment / SpaceNlChar)*
(Comment / SpaceChar)*
RequiredSpaceNl(Comment / SpaceNlChar)+
AfterWord(Comment / SpaceNlChar)+ / !NameFirstLetter
SpaceNlChar' ' / '\n' / '\r' / '\t' / '\f'
SpaceChar' ' / '\t' / '\f'
Cr'\r'
Nl'\n'
Sep(';' / (Cr* Nl))

Зарезервированные слова

Эти слова нельзя использовать в качестве идентификаторов:

2012-2025