We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
Using this tool https://www.bottlecaps.de/convert/ to convert https://github.com/blech-lang/blech/blob/main/src/Frontend/Parser.fsy and manually adding the tokens from https://github.com/blech-lang/blech/blob/main/src/Frontend/BlechLexer.fsl we can have a nice navigable railroad diagram (https://en.wikipedia.org/wiki/Syntax_diagram).
Copy and paste the EBNF shown bellow at https://www.bottlecaps.de/rr/ui on the tab Edit Grammar then click the tab View Diagram.
Edit Grammar
View Diagram
/* converted on Thu Sep 8, 2022, 10:21 (UTC+02) by bison-to-w3c v0.59 which is Copyright (c) 2011-2022 by Gunther Rademacher <[email protected]> */ //From https://github.com/blech-lang/blech/blob/main/src/Frontend/Parser.fsy Compilation ::= ( Module | Signature | Program | error ) EOF Name ::= ID PointedName ::= Name ( POINT Name )* UnitExpr ::= NATCONST | PointedName | UnitExpr ( ( MUL | DIV ) UnitExpr | EXP NATCONST ) | LPAREN UnitExpr RPAREN Unit ::= OptAnnotations UNIT ( Name ( ASSIGN UnitExpr )? | ErrorBeforeEOL EOL ) OptUnitDef ::= ( LBRACKET UnitExpr RBRACKET )? Type ::= Datatype | SecondClassType Datatype ::= PointedName | LogicalDatatype | NumberDatatype | ArrayDatatype LogicalDatatype ::= BOOL | BITS8 | BITS16 | BITS32 | BITS64 NumberDatatype ::= ( FLOAT32 | FLOAT64 | NAT8 | NAT16 | NAT32 | NAT64 | INT8 | INT16 | INT32 | INT64 ) OptUnitDef ArrayDatatype ::= LBRACKET Expr RBRACKET Datatype SecondClassType ::= SignalType | SliceType SignalType ::= Datatype? SIGNAL SliceType ::= LBRACKET RBRACKET Datatype OptRef ::= REF? TypeAnnotation ::= COLON Type OptTypeAnnotation ::= TypeAnnotation? OptModifiers ::= ( REF | ERROR )? TypeAliasDecl ::= OptAnnotations OptModifiers TYPEALIAS ( Name ASSIGN Type | ErrorBeforeEOL EOL ) OpaqueTypeDecl ::= OptAnnotations OptModifiers TYPE ( Name | ErrorBeforeEOL EOL ) OptExtension ::= ( EXTENSION ExtensionMembers )? OptExtensionDecl ::= ( EXTENSION ExtensionMemberDecls )? StructDecl ::= OptAnnotations OptModifiers STRUCT ( Name DynamicMembers OptExtensionDecl | error ) END StructDef ::= OptAnnotations OptModifiers STRUCT ( Name DynamicMembers OptExtension | error ) END VariableQualifier ::= LET | VAR ConstantQualifier ::= CONST | PARAM EnumDecl ::= OptAnnotations OptModifiers ENUM ( Name OptRawType EnumTagList OptExtensionDecl | error ) END EnumDef ::= OptAnnotations OptModifiers ENUM ( Name OptRawType EnumTagList OptExtension | error ) END OptRawType ::= ( COLON Datatype )? EnumTagList ::= EnumTag+ EnumTag ::= Name OptRawValue OptDefault OptSemicolon OptRawValue ::= ( ASSIGN Expr )? OptDefault ::= DEFAULT? Location ::= ( PREV | NEXT )? Access AssignLocation ::= Location | WILDCARD Access ::= Name ( POINT ( Name | LBRACKET Expr RBRACKET ) | LBRACKET Expr RBRACKET )* Literal ::= TRUE | FALSE | BINCONST | OCTCONST | HEXCONST | NumberLiteral NumberLiteral ::= ( NATCONST | FLOATCONST | HEXFLOATCONST ) OptUnitDef Initialisation ::= SliceInitialiser | BraceInitialiser SliceInitialiser ::= LBRACKET OptExpr COMMA OptExpr RBRACKET Location OptExpr ::= Expr? BraceInitialiser ::= LBRACE ( ( ArrayFieldExpr ( FieldSep ArrayFieldExpr )* | StructFieldExpr ( FieldSep StructFieldExpr )* ) OptFieldSep | error )? RBRACE StructFieldExpr ::= Name ASSIGN Expr ArrayFieldExpr ::= ( LBRACKET Expr RBRACKET ASSIGN )? Expr OptFieldSep ::= FieldSep? FieldSep ::= COMMA Expr ::= Expr ( ( AND | OR | ADD | SUB | MUL | DIV | MOD | EXP | EQU | IEQ | LES | GRT | LEQ | GEQ | IDEQU | IDIEQ | BAND | BOR | BXOR | SHR | SHL | SSHR | ROTL | ROTR ) Expr | ( COLON | AS | ASBANG ) Datatype ) | PrimaryExpr | ( IF Expr THEN | TRY ) Expr ELSE Expr PrimaryExpr ::= ( NOT | SUB | BNOT | LEN | CAP ) Expr | Location ( Inputs OptOutputs )? | LPAREN Expr RPAREN | Literal | ERROR | Initialisation OptLocationList ::= ( Location ( COMMA Location )* )? OptExprList ::= ( Expr ( COMMA Expr )* )? ConditionSeq ::= Condition ( COMMA Condition )* Condition ::= Expr | SignalBinding VerificationCondition ::= ( ASSUME | ASSERT ) ( ConditionSeq STRING? | ErrorBeforeEOL EOL ) LocalVariable ::= OptAnnotations ( VariableQualifier OptRef Name ( TypeAnnotation | OptTypeAnnotation ASSIGN Expr ) | EXTERN VariableQualifier OptRef Name TypeAnnotation ) LocalConstant ::= OptAnnotations ( EXTERN ConstantQualifier OptRef Name TypeAnnotation | ConstantQualifier OptRef Name OptTypeAnnotation ASSIGN Expr ) ForLoops ::= FOR ( FreshLocation ( ASSIGN Expr COMMA ( Expr COMMA )? | IN | OF ) Expr DO Block | error ) END FreshLocation ::= VariableQualifier Name OptTypeAnnotation FunctionCall ::= Location ( OptPartial Inputs OptOutputs | ErrorBeforeEOL EOL ) ValueReceiver ::= AssignLocation | FreshLocation ActivityCall ::= OptNext RUN ( ( ValueReceiver ASSIGN )? Location OptPartial Inputs OptOutputs | ErrorBeforeEOL EOL ) EmitStatement ::= EMIT ValueReceiver ( ASSIGN Expr )? Block ::= ( Stmt | Pragma | SEMICOLON )* OptReturn Stmt ::= ELLIPSIS | VerificationCondition | LocalVariable | LocalConstant | AssignLocation ASSIGN Expr | AWAIT ( ConditionSeq | PAST Expr ) | EmitStatement | FunctionCall | ActivityCall | ( IF ( ConditionSeq THEN Block ( ELSEIF ConditionSeq THEN Block )* ( ELSE Block )? | error ) | WHILE ( ConditionSeq REPEAT Block | error ) | COBEGIN OptWeak ( Block ( WITH OptWeak Block )+ | error ) | DO ( Block | error ) | REPEAT ( Block ( UNTIL ConditionSeq )? | error ) | WHEN ( ConditionSeq Preemption Block ( THEN Block )? | error ) | TRY ( Block ( ELSE Block ( THEN Block )? )? | error ) ) END | ForLoops Preemption ::= ABORT | RESET | SUSPEND Inputs ::= LPAREN OptExprList RPAREN OptOutputs ::= ( LPAREN OptLocationList RPAREN )? OptReturn ::= ( ( RETURN ( OptNext RUN Location OptPartial Inputs OptOutputs | OptExpr ) | THROW OptExpr ) OptSemicolon )? SignalBinding ::= FreshLocation ASSIGN Expr OptNext ::= NEXT? OptSemicolon ::= SEMICOLON? OptWeak ::= WEAK? OptSingletonDef ::= SINGLETON? OptSingletonDecl ::= SingletonDecl? SingletonDecl ::= SINGLETON OptSingletonUsage OptSingletonUsage ::= ( LBRACKET PointedName ( COMMA PointedName )* RBRACKET )? OptPartial ::= QUEST? Subprogram ::= OptAnnotations OptSingletonDecl FunOrAct ( Name OptPartial InputParameters OptOutputParameters OptReturns OptThrows Block | error ) END ExternalFunction ::= OptAnnotations EXTERN OptSingletonDecl FUNCTION ( Name InputParameters OptOutputParameters OptReturns | ErrorBeforeEOL ) OpaqueSingleton ::= OptAnnotations SingletonDecl Name Prototype ::= OptAnnotations OptSingletonDecl FunOrAct ( Name InputParameters OptOutputParameters OptReturns | ErrorBeforeEOL ) FunOrAct ::= FUNCTION | ACTIVITY InputParameters ::= LPAREN ( InputParameter ( COMMA InputParameter )* | error )? RPAREN OptOutputParameters ::= ( LPAREN ( OutputParameter ( COMMA OutputParameter )* | error )? RPAREN )? OptReturns ::= ( RETURNS OptRef OptSharing Type )? OptThrows ::= ( THROWS Datatype )? InputParameter ::= OptRef Name OptSharing COLON Type OutputParameter ::= Name OptSharing COLON Type OptSharing ::= ( SHARES Name ( COMMA Name )* )? Constant ::= OptAnnotations ConstantQualifier ( OptRef Name OptTypeAnnotation ASSIGN Expr | ErrorBeforeEOL EOL ) ExternalConstant ::= OptAnnotations EXTERN ConstantQualifier ( OptRef Name TypeAnnotation | ErrorBeforeEOL EOL ) Variable ::= OptAnnotations VariableQualifier ( OptRef Name ( TypeAnnotation | OptTypeAnnotation ASSIGN Expr ) | ErrorBeforeEOL EOL ) ExternalVariable ::= OptAnnotations EXTERN VariableQualifier ( OptRef Name TypeAnnotation | ErrorBeforeEOL EOL ) ModuleMember ::= Unit | EnumDef | StructDef | OpaqueSingleton | ExtensionMember | Extension | Pragma ExtensionMember ::= Subprogram | ExternalFunction | Constant | ExternalConstant | TypeAliasDecl DynamicMember ::= Variable ModuleMembers ::= ( ModuleMember | SEMICOLON )* ExtensionMembers ::= ( ExtensionMember | Pragma | SEMICOLON )* DynamicMembers ::= ( DynamicMember | Pragma | SEMICOLON )* Extension ::= EXTENSION Name ExtensionMembers END ModuleHead ::= INTERNAL? MODULE ModuleSpec ::= OptAnnotations ModuleHead ( Exposing | ErrorBeforeEOL EOL ) Exposing ::= ( EXPOSES ( Name ( COMMA Name )* | ErrorBeforeEOL EOL ) )? ModulePath ::= STRING Import ::= IMPORT ( INTERNAL? NameOrWildcard ModulePath Exposing | ErrorBeforeEOL EOL ) NameOrWildcard ::= Name | WILDCARD ImportList ::= ( Import | SEMICOLON )* Module ::= ImportList ModuleSpec ModuleMembers Program ::= ImportList ModuleMember ModuleMembers SignatureHead ::= INTERNAL? SIGNATURE SignatureSpec ::= OptAnnotations SignatureHead SignatureMember ::= Unit | EnumDecl | StructDecl | OpaqueTypeDecl | OpaqueSingleton | ExtensionMemberDecl | ExtensionDecl ExtensionDecl ::= EXTENSION Name ExtensionMemberDecls END ExtensionMemberDecl ::= Prototype | ExternalFunction | Constant | ExternalConstant | TypeAliasDecl ExtensionMemberDecls ::= ( ExtensionMemberDecl | Pragma | SEMICOLON )* Signature ::= ImportList SignatureSpec ( SignatureMember | Pragma | SEMICOLON )* ErrorBeforeEOL ::= error Pragma ::= ATAT LBRACKET Attribute RBRACKET OptAnnotations ::= Annotation* Annotation ::= AT LBRACKET Attribute RBRACKET | LINEDOC | BLOCKDOC Attribute ::= Identifier ( ASSIGN AttributeLiteral | LPAREN ( Attribute COMMA )* Attribute? RPAREN )? Identifier ::= STRING | ID AttributeLiteral ::= STRING | MULTILINESTRING | TRUE | FALSE | BINCONST | OCTCONST | HEXCONST | OptSub ( NATCONST | FLOATCONST | HEXFLOATCONST ) OptSub ::= SUB? //Tokens //From https://github.com/blech-lang/blech/blob/main/src/Frontend/BlechLexer.fsl //| \("[^"]+"\)\s+{ \(\w+\).+ -> \2 ::= \1 /* | "/*" { commentDepth <- 1 commentStart <- Some (getRange lexbuf) SkipBlockComment lexbuf } | "//" { SkipLineComment lexbuf } (* --- strings --- *) | '"' { startString lexbuf CollectSingleLineString lexbuf } | triplequotes { startString lexbuf CollectMultiLineString lexbuf } (* ---- doc comments ---- *) | "///" { tokenBuilder.Init (getRange lexbuf) CollectLineDoc lexbuf } | "/**" { tokenBuilder.Init (getRange lexbuf) CollectBlockDoc lexbuf } */ /* ---- file system: reserved directory name for blech transpilations ---- */ BLECH ::= "blech" /* ---- module system ---- */ MODULE ::= "module" IMPORT ::= "import" EXPOSES ::= "exposes" SIGNATURE ::= "signature" INTERNAL ::= "internal" /* --- extensions --- */ EXTENSION ::= "extension" /* ---- predefined types ---- */ BOOL ::= "bool" BITS8 ::= "bits8" BITS16 ::= "bits16" BITS32 ::= "bits32" BITS64 ::= "bits64" NAT8 ::= "nat8" NAT16 ::= "nat16" NAT32 ::= "nat32" NAT64 ::= "nat64" INT8 ::= "int8" INT16 ::= "int16" INT32 ::= "int32" INT64 ::= "int64" FLOAT32 ::= "float32" FLOAT64 ::= "float64" /* --- user-defined types --- */ TYPEALIAS ::= "typealias" TYPE ::= "type" ENUM ::= "enum" STRUCT ::= "struct" /* --- signals --- */ SIGNAL ::= "signal" /* --------- units of measure --------- */ UNIT ::= "unit" /* --- clocks --- */ /*CLOCK ::= "clock" COUNT ::= "count" UP ::= "up" DOWN ::= "down" OFF ::= "off" JOIN ::= "join" MEET ::= "meet" TICK ::= "tick" ON ::= "on" */ /* --------- actions --------- */ EMIT ::= "emit" PAST ::= "past" ASSIGN ::= "=" ASSUME ::= "assume" ASSERT ::= "assert" /* --------- types, activties, functions --------- */ ACTIVITY ::= "activity" FUNCTION ::= "function" VAR ::= "var" LET ::= "let" REF ::= "ref" SINGLETON ::= "singleton" PARAM ::= "param" CONST ::= "const" SHARES ::= "shares" /* ----- FFI ------ */ EXTERN ::= "extern" /* --------- Blech statements --------- */ ABORT ::= "abort" AWAIT ::= "await" COBEGIN ::= "cobegin" DEFAULT ::= "default" DO ::= "do" ELSE ::= "else" ELSEIF ::= "elseif" END ::= "end" FOR ::= "for" IF ::= "if" IN ::= "in" OF ::= "of" PRINT ::= "print" REPEAT ::= "repeat" RUN ::= "run" RESET ::= "reset" RETURN ::= "return" RETURNS ::= "returns" SUSPEND ::= "suspend" THEN ::= "then" UNTIL ::= "until" WEAK ::= "weak" WHEN ::= "when" WHILE ::= "while" WITH ::= "with" TRY ::= "try" THROW ::= "throw" THROWS ::= "throws" /* ----- error handling -----*/ ERROR ::= "error" /* --------- expressions and operators --------- */ TRUE ::= "true" FALSE ::= "false" /* logical operators */ NOT ::= "not" AND ::= "and" OR ::= "or" /* arithmetic operators */ ADD ::= "+" SUB ::= "-" MUL ::= "*" DIV ::= "/" MOD ::= "%" EXP ::= "**" /* bitwise operators */ BAND ::= "&" BOR ::= "|" BXOR ::= "^" BNOT ::= "~" SHL ::= "<<" SHR ::= ">>" /* advanced bitwise operators */ SSHR ::= "+>>" ROTL ::= "<<>" ROTR ::= "<>>" /* relational operators */ EQU ::= "==" IEQ ::= "!=" LES ::= "<" LEQ ::= "<=" GRT ::= ">" GEQ ::= ">=" /* identity operators */ IDEQU ::= "===" IDIEQ ::= "!==" /* static cast */ AS ::= "as" /* forced cast */ ASBANG ::= "as!" /* annotations */ AT ::= "@" ATAT ::= "@@" /* length operators on arrays and slices */ LEN ::= "#" CAP ::= "##" /* -------------- Access operators ------------*/ PREV ::= "prev" NEXT ::= "next" /* --------- delimiters and punctuations --------- */ LBRACE ::= "{" RBRACE ::= "}" LBRACKET ::= "[" RBRACKET ::= "]" LPAREN ::= "(" RPAREN ::= ")" ELLIPSIS ::= "..." POINT ::= "." COLON ::= ":" COMMA ::= "," SEMICOLON ::= ";" QUEST ::= "?" /* --------- literals --------- */ /* | binliteral { BINCONST (getLexemeAndRange lexbuf) } | octliteral { OCTCONST (getLexemeAndRange lexbuf) } | hexliteral { HEXCONST (getLexemeAndRange lexbuf) } | natliteral { NATCONST (getLexemeAndRange lexbuf) } | floatliteral { FLOATCONST (getLexemeAndRange lexbuf) } | hexfloatliteral { HEXFLOATCONST (getLexemeAndRange lexbuf) } | identifier { ID (getLexemeAndRange lexbuf) } | wildcard { WILDCARD (getLexemeAndRange lexbuf) } */ /* --------- end of file and invalid source code characters --------- */ /* | eof { EOF (getRange lexbuf) } | _ { unknownToken lexbuf; Token lexbuf } */
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Using this tool https://www.bottlecaps.de/convert/ to convert https://github.com/blech-lang/blech/blob/main/src/Frontend/Parser.fsy and manually adding the tokens from https://github.com/blech-lang/blech/blob/main/src/Frontend/BlechLexer.fsl we can have a nice navigable railroad diagram (https://en.wikipedia.org/wiki/Syntax_diagram).
Copy and paste the EBNF shown bellow at https://www.bottlecaps.de/rr/ui on the tab
Edit Grammar
then click the tabView Diagram
.The text was updated successfully, but these errors were encountered: