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 #10

Open
mingodad opened this issue Sep 8, 2022 · 0 comments
Open

Grammar railroad diagram #10

mingodad opened this issue Sep 8, 2022 · 0 comments

Comments

@mingodad
Copy link

mingodad commented Sep 8, 2022

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.

/* 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 }
*/
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