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

Open
mingodad opened this issue Nov 16, 2021 · 2 comments
Open

Grammar railroad diagram #348

mingodad opened this issue Nov 16, 2021 · 2 comments

Comments

@mingodad
Copy link

Asking this modified byacc (https://github.com/mingodad/lalr-parser-test/tree/main/byacc) to output an EBNF grammar that can be used on https://www.bottlecaps.de/rr/ui to get a railroad diagram (https://en.wikipedia.org/wiki/Syntax_diagram).

Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui in the TAB Edit Grammar then switch to the TAB View Diagram.

/* "byacc -e knix.y" the output is in y.ebnf and add the tokens manually if you want more details */
Program ::=
	 ToplevelStatementList

ToplevelStatementList ::=
	 Statement
	| ToplevelStatementList Statement

StatementList ::=
	 Statement
	| StatementList Statement

Statement ::=
	 NonSemicolonStatement
	| SemicolonStatement

NonSemicolonStatement ::=
	 BlockStatement
	| NamespaceStatement
	| EnumStatement
	| IfStatement
	| CaseStatement
	| TryCatchStatement
	| LabelStatement
	| LabelledStatement
	| IMPORT VAR NAME '=' STR ';'
	| error RBBR

SemicolonStatement ::=
	 ReturnStatement
	| YieldStatement
	| ThrowStatement
	| MixinStatement
	| ExpressionStatement
	| DefinitionStatement
	| BreakStatement
	| error ';'
	| error LBBR
	| error IF
	| error DO
	| error WHILE
	| error FOR
	| error TRY
	| error SWITCH
	| error CASE
	| error ENUM
	| error CLASS
	| error FUNCTION
	| error PRIVATE
	| error PUBLIC

LabelledStatement ::=
	 WhileStatement
	| DoWhileStatement
	| SwitchCaseStatement
	| ForStatement

BlockStatement ::=
	 LBBR RBBR
	| LBBR StatementList RBBR

NamespaceStatement ::=
	 NAMESPACE NamespaceName LBBR RBBR
	| SYSNS NamespaceName LBBR RBBR
	| NAMESPACE NamespaceName LBBR StatementList RBBR
	| SYSNS NamespaceName LBBR StatementList RBBR

NamespaceName ::=
	 NAME

EnumStatement ::=
	 ENUM LBBR EnumList Comma_Opt RBBR

EnumList ::=
	 NAME
	| NAME '=' INT
	| NAME '=' '-' INT
	| EnumList ',' NAME
	| EnumList ',' NAME '=' INT
	| EnumList ',' NAME '=' '-' INT

DefinitionStatement ::=
	 VarDeclStatement
	| FunctionDeclStatement
	| ClassDeclStatement
	| ModuleDeclStatement

LabelStatement ::=
	 NAME ':' LabelledStatement

IfStatement ::=
	 IF '(' AssignExpressionList ')' Statement
	| IF '(' AssignExpressionList ')' Statement ELSE Statement

WhileStatement ::=
	 WHILE '(' AssignExpressionList ')' Statement

DoWhileStatement ::=
	 DO Statement WHILE '(' AssignExpressionList ')' ';'

SwitchCaseStatement ::=
	 SWITCH '(' AssignExpressionList ')' BlockStatement

CaseStatement ::=
	 CASE AssignExpression ':'
	| DEFAULT ':'

ForStatement ::=
	 FOR '(' VAR DeclAssignExpressionList ';' AssignExpressionList_Opt ';' AssignExpressionList_Opt ')' Statement
	| FOR '(' AssignExpressionList ';' AssignExpressionList_Opt ';' AssignExpressionList_Opt ')' Statement
	| FOR '(' ';' AssignExpressionList_Opt ';' AssignExpressionList_Opt ')' Statement
	| FOR '(' ForInVariable IN AssignExpressionList ')' Statement
	| FOR '(' VAR ForInVariable IN AssignExpressionList ')' Statement

ForInVariable ::=
	 VarName
	| LMBR ArrayItemList RMBR

TryCatchStatement ::=
	 TRY BlockStatement CatchStatement_Opt FinallyStatement_Opt

CatchStatement_Opt ::=
	 /*empty*/
	| CATCH BlockStatement
	| CATCH '(' NAME ')' BlockStatement

FinallyStatement_Opt ::=
	 /*empty*/
	| FINALLY BlockStatement

BreakStatement ::=
	 BREAK Modifier_Opt ';'
	| BREAK NAME Modifier_Opt ';'
	| CONTINUE Modifier_Opt ';'
	| CONTINUE NAME Modifier_Opt ';'

ReturnStatement ::=
	 RETURN GetLineNumber AssignExpressionList_Opt Modifier_Opt ';'
	| SYSRET_NV ';'

YieldStatement ::=
	 YieldExpression Modifier_Opt ';'

YieldExpression ::=
	 YIELD AssignExpression
	| YIELD
	| AssignExpression '=' YIELD AssignExpression
	| AssignExpression '=' YIELD

ThrowStatement ::=
	 THROW AssignExpressionList_Opt Modifier_Opt ';'

MixinStatement ::=
	 MIXIN MixinModuleList ';'

MixinModuleList ::=
	 NAME
	| MixinModuleList ',' NAME

ExpressionStatement ::=
	 AssignExpression_Opt ';'

AssignExpression_Opt ::=
	 /*empty*/
	| AssignExpression Modifier_Opt

AssignExpressionList_Opt ::=
	 /*empty*/
	| AssignExpressionObjList

Modifier_Opt ::=
	 /*empty*/
	| IF '(' AssignExpressionList ')'

AssignExpression ::=
	 TernaryExpression
	| AssignExpression '=' AssignRightHandSide
	| AssignExpression SHLEQ AssignRightHandSide
	| AssignExpression SHREQ AssignRightHandSide
	| AssignExpression ADDEQ AssignRightHandSide
	| AssignExpression SUBEQ AssignRightHandSide
	| AssignExpression MULEQ AssignRightHandSide
	| AssignExpression DIVEQ AssignRightHandSide
	| AssignExpression MODEQ AssignRightHandSide
	| AssignExpression ANDEQ AssignRightHandSide
	| AssignExpression OREQ AssignRightHandSide
	| AssignExpression XOREQ AssignRightHandSide
	| AssignExpression LANDEQ AssignRightHandSide
	| AssignExpression LOREQ AssignRightHandSide
	| AssignExpression LUNDEFEQ AssignRightHandSide

AssignRightHandSide ::=
	 TernaryExpression
	| ObjectSpecialSyntax

ObjectSpecialSyntax ::=
	 LBBR RBBR
	| ObjectSpecialSyntax PostIncDec
	| ObjectSpecialSyntax LMBR AssignExpression RMBR
	| ObjectSpecialSyntax '.' PropertyName
	| ObjectSpecialSyntax '.' TYPEOF
	| ObjectSpecialSyntax '(' CallArgumentList_Opts ')'
	| ObjectSpecialSyntax SimpleFuncCallFactor

TernaryExpression ::=
	 FunctionExpression
	| LogicalUndefExpression '?' TernaryExpression ':' TernaryExpression

FunctionExpression ::=
	 AnonymousFunctionDeclExpression
	| LogicalUndefExpression

LogicalUndefExpression ::=
	 LogicalOrExpression
	| LogicalUndefExpression LUNDEF LogicalOrExpression

LogicalOrExpression ::=
	 LogicalAndExpression
	| LogicalOrExpression LOR LogicalAndExpression

LogicalAndExpression ::=
	 BitOrExpression
	| LogicalAndExpression LAND BitOrExpression

BitOrExpression ::=
	 BitXorExpression
	| BitOrExpression '|' BitXorExpression

BitXorExpression ::=
	 BitAndExpression
	| BitXorExpression '^' BitAndExpression

BitAndExpression ::=
	 CompareEqualExpression
	| BitAndExpression '&' CompareEqualExpression

CompareEqualExpression ::=
	 CompareExpression
	| CompareEqualExpression EQEQ CompareExpression
	| CompareEqualExpression NEQ CompareExpression

CompareExpression ::=
	 ShiftExpression
	| CompareExpression '<' ShiftExpression
	| CompareExpression LE ShiftExpression
	| CompareExpression '>' ShiftExpression
	| CompareExpression GE ShiftExpression
	| CompareExpression LGE ShiftExpression

ShiftExpression ::=
	 Expression
	| ShiftExpression SHL Expression
	| ShiftExpression SHR Expression

Expression ::=
	 Term
	| Expression '+' Term
	| Expression '-' Term

Term ::=
	 Exponentiation
	| Term '*' Exponentiation
	| Term '/' Exponentiation
	| Term '%' Exponentiation

Exponentiation ::=
	 RegexMatch
	| Exponentiation POW RegexMatch

RegexMatch ::=
	 PrefixExpression
	| RegexMatch REGEQ PrefixExpression
	| RegexMatch REGNE PrefixExpression
	| PrefixExpression DOTS2
	| PrefixExpression DOTS2 PrefixExpression
	| PrefixExpression DOTS3
	| PrefixExpression DOTS3 PrefixExpression

PrefixExpression ::=
	 CastExpression
	| '~' PrefixExpression
	| '!' PrefixExpression
	| '+' PostfixExpression
	| '-' PostfixExpression
	| '*' PrefixExpression
	| INC PostfixExpression
	| DEC PostfixExpression

CastExpression ::=
	 PostfixExpression
	| PostfixExpression AS TypeName

PostfixExpression ::=
	 Factor
	| PostfixExpression PostIncDec
	| PostfixExpression LMBR AssignExpression RMBR
	| PostfixExpression '.' PropertyName
	| PostfixExpression '.' TYPEOF
	| PostfixExpression '(' CallArgumentList_Opts ')'
	| PostfixExpression SimpleFuncCallFactorOrBlock

SimpleFuncCallFactorOrBlock ::=
	 BlockStatement
	| SimpleFuncCallFactor

SimpleFuncCallFactor ::=
	 LBBR DARROW TernaryExpression RBBR
	| LBBR '&' '(' ArgumentList_Opts ')' DARROW TernaryExpression RBBR
	| LBBR '&' '(' ArgumentList_Opts ')' RBBR
	| LBBR '&' '(' ArgumentList_Opts ')' ':' RBBR
	| LBBR '&' '(' ArgumentList_Opts ')' StatementList RBBR
	| LBBR '&' '(' ArgumentList_Opts ')' ':' StatementList RBBR

PostIncDec ::=
	 INC
	| DEC

Factor ::=
	 INT
	| DBL
	| BIGINT
	| NUL
	| VarName
	| TRUE
	| FALSE
	| SRCFILE
	| Array
	| Binary
	| Object
	| SimpleFuncCallFactor
	| Regex
	| '.' PropertyName
	| IMPORT '(' '(' STR ')' ')'
	| '(' AssignExpression ')'
	| '(' ObjectSpecialSyntax ')'
	| '(' STR ')'
	| NEW Factor
	| '@' PropertyName
	| '@' TYPEOF

VarName ::=
	 NAME
	| TYPE

PropertyName ::=
	 NAME
	| IF
	| ELSE
	| WHILE
	| DO
	| FOR
	| IN
	| TRY
	| CATCH
	| FINALLY
	| BREAK
	| CONTINUE
	| SWITCH
	| CASE
	| DEFAULT
	| NEW
	| VAR
	| CONST
	| NATIVE
	| FUNCTION
	| SYSFUNC
	| PUBLIC
	| PRIVATE
	| PROTECTED
	| CLASS
	| MODULE
	| RETURN
	| YIELD
	| THROW
	| NUL
	| TRUE
	| FALSE
	| IMPORT
	| USING
	| TYPE
	| SHL
	| SHR
	| EQEQ
	| NEQ
	| LE
	| '<'
	| GE
	| '>'
	| LGE
	| '+'
	| '-'
	| '*'
	| '/'
	| '%'
	| '&'
	| '|'
	| '^'
	| LMBR RMBR
	| '(' ')'

Array ::=
	 LMBR RMBR
	| LMBR ArrayItemList RMBR

Binary ::=
	 '<' '>'
	| '<' BinStart ArrayItemList BINEND

BinStart ::=
	 /*empty*/

Object ::=
	 LBBR KeyValueList Comma_Opt RBBR

Comma_Opt ::=
	 /*empty*/
	| ','

ArrayItemList ::=
	 ArrayItemListCore
	| CommaList ArrayItemListCore

CommaList ::=
	 ','
	| CommaList ','

ArrayItemListCore ::=
	 AssignExpression
	| DOTS3 AssignRightHandSide
	| ArrayItemListCore ','
	| ArrayItemListCore ',' AssignExpression
	| ArrayItemListCore ',' DOTS3 AssignRightHandSide

AssignExpressionList ::=
	 AssignExpression
	| AssignExpressionList ',' AssignExpression

AssignExpressionObjList ::=
	 AssignExpression
	| LBBR RBBR
	| AssignExpressionObjList ',' AssignExpression
	| AssignExpressionObjList ',' LBBR RBBR

KeyValueList ::=
	 KeyValue
	| KeyValueList ',' KeyValue

KeyValue ::=
	 '(' STR ')' ':' AssignExpression
	| '(' STR ')' ':' ObjectSpecialSyntax
	| NAME ':' AssignExpression
	| NAME ':' ObjectSpecialSyntax
	| KeySpecialName ':' AssignExpression
	| KeySpecialName ':' ObjectSpecialSyntax
	| DOTS3 AssignRightHandSide

KeySpecialName ::=
	 IF
	| ELSE
	| WHILE
	| DO
	| FOR
	| IN
	| TRY
	| CATCH
	| FINALLY
	| BREAK
	| CONTINUE
	| SWITCH
	| CASE
	| NEW
	| VAR
	| CONST
	| FUNCTION
	| SYSFUNC
	| PUBLIC
	| PRIVATE
	| PROTECTED
	| CLASS
	| MODULE
	| RETURN
	| YIELD
	| THROW
	| NUL
	| TRUE
	| FALSE
	| IMPORT
	| USING
	| TYPE
	| TYPEOF
	| SHL
	| SHR
	| EQEQ
	| NEQ
	| LE
	| '<'
	| GE
	| '>'
	| LGE
	| '+'
	| '-'
	| '*'
	| '/'
	| '%'
	| '&'
	| '|'
	| '^'
	| LMBR RMBR
	| '(' ')'

Regex ::=
	 '/' RegexStart RegexString
	| DIVEQ RegexStart RegexString
	| REGPF RegexString

RegexStart ::=
	 /*empty*/

RegexString ::=
	 '(' STR ')'

VarDeclStatement ::=
	 VAR DeclAssignExpressionList ';'
	| CONST DeclAssignExpressionList ';'

DeclAssignExpressionList ::=
	 DeclAssignExpression
	| DeclAssignExpressionList ',' DeclAssignExpression

DeclAssignExpression ::=
	 VarName
	| VarName ':' TypeName ReturnType_Opt
	| VarName '=' DeclAssignRightHandSide
	| VarName ':' TypeName ReturnType_Opt '=' DeclAssignRightHandSide
	| LMBR ArrayItemList RMBR '=' DeclAssignRightHandSide
	| LBBR ArrayItemList RBBR '=' DeclAssignRightHandSide

DeclAssignRightHandSide ::=
	 AssignRightHandSide
	| DeclAssignRightHandSide '=' AssignRightHandSide

FunctionDeclStatement ::=
	 NormalFunctionDeclStatement
	| ClassFunctionDeclStatement

NormalFunctionDeclStatement ::=
	 FUNCTION NAME '(' ArgumentList_Opts ')' BlockStatement
	| SYSFUNC NAME '(' ArgumentList_Opts ')' BlockStatement
	| NativeKeyword NativeType_Opt NAME '(' ArgumentList_Opts ')' BlockStatement

NativeKeyword ::=
	 NATIVE

NativeType_Opt ::=
	 /*empty*/
	| ':' TypeName

AnonymousFunctionDeclExpression ::=
	 FUNCTION '(' ArgumentList_Opts ')' BlockStatement
	| SYSFUNC '(' ArgumentList_Opts ')' BlockStatement
	| COROUTINE '(' ArgumentList_Opts ')' BlockStatement
	| NativeKeyword NativeType_Opt '(' ArgumentList_Opts ')' BlockStatement
	| '&' '(' ArgumentList_Opts ')' DARROW TernaryExpression
	| '&' '(' ArgumentList_Opts ')' DARROW BlockStatement
	| '&' BlockStatement

ClassFunctionDeclStatement ::=
	 PUBLIC ClassFunctionName '(' ArgumentList_Opts ')' BlockStatement
	| PRIVATE ClassFunctionName '(' ArgumentList_Opts ')' BlockStatement
	| PROTECTED ClassFunctionName '(' ArgumentList_Opts ')' BlockStatement

ClassFunctionName ::=
	 NAME
	| KeySpecialName

ClassDeclStatement ::=
	 CLASS NAME ClassArgumentList_Opts Inherit_Opt BlockStatement
	| SYSCLASS NAME ClassArgumentList_Opts Inherit_Opt BlockStatement

ModuleDeclStatement ::=
	 MODULE NAME BlockStatement
	| SYSMODULE NAME BlockStatement

Inherit_Opt ::=
	 /*empty*/
	| ':' GetLineNumber InheritFactor ClassCallArgumentList_Opts

InheritFactor ::=
	 Factor
	| InheritFactor LMBR AssignExpression RMBR
	| InheritFactor '.' PropertyName
	| InheritFactor '.' TYPEOF

ClassArgumentList_Opts ::=
	 /*empty*/
	| '(' ArgumentList_Opts ')'

ArgumentList_Opts ::=
	 /*empty*/
	| ArgumentList

ArgumentList ::=
	 Argument
	| ArgumentList ',' Argument

Argument ::=
	 VarName
	| VarName ':' TypeName ReturnType_Opt
	| LMBR ArrayItemList RMBR
	| LBBR ArrayItemList RBBR
	| DOTS3 VarName

TypeName ::=
	 TYPE ArrayLevel
	| NATIVE
	| NAME ArrayLevel

ArrayLevel ::=
	 /*empty*/
	| LMBR RMBR
	| ArrayLevel LMBR RMBR

ReturnType_Opt ::=
	 /*empty*/
	| '(' TypeName ')'

ClassCallArgumentList_Opts ::=
	 /*empty*/
	| '(' CallArgumentList_Opts ')'

CallArgumentList_Opts ::=
	 /*empty*/
	| CallArgumentList

CallArgumentList ::=
	 CallArgument
	| DOTS3 AssignRightHandSide
	| CallArgumentList ',' CallArgument
	| CallArgumentList ',' DOTS3 AssignRightHandSide

CallArgument ::=
	 AssignExpression
	| ObjectSpecialSyntax
	| STR

GetLineNumber ::=
	 /*empty*/

//Tokens
//if (strcmp(val, \("[^"]+"\).+?return \([^;]+\).+
SRCFILE ::= "__FILE__"
IMPORT ::= "_import"
SYSFUNC ::= "_function"
SYSCLASS ::= "_class"
SYSMODULE ::= "_module"
SYSNS ::= "_namespace"
COROUTINE ::= "_coroutine"
SYSRET_NV ::= "_ret_nv"
AS ::= "as"
BREAK ::= "break"
CLASS ::= "class"
CATCH ::= "catch"
CASE ::= "case"
CONTINUE ::= "continue"
CONST ::= "const"
DO ::= "do"
DEFAULT ::= "default"
ELSE ::= "else"
ENUM ::= "enum"
FUNCTION ::= "function"
FOR ::= "for"
FINALLY ::= "finally"
FALSE ::= "false"
IF ::= "if"
IN ::= "in"
IMPORT ::= "import"
TYPEOF ::= "isNull"
TYPEOF ::= "isUndefined"
TYPEOF ::= "isDefined"
TYPEOF ::= "isInteger"
TYPEOF ::= "isBigInteger"
TYPEOF ::= "isNumber"
TYPEOF ::= "isString"
TYPEOF ::= "isDouble"
TYPEOF ::= "isBinary"
TYPEOF ::= "isFunction"
TYPEOF ::= "isArray"
TYPEOF ::= "isObject"
MODULE ::= "module"
MIXIN ::= "mixin"
NUL ::= "null"
NEW ::= "new"
NATIVE ::= "native"
NAMESPACE ::= "namespace"
PUBLIC ::= "public"
PRIVATE ::= "private"
PROTECTED ::= "protected"
RETURN ::= "return"
SWITCH ::= "switch"
THROW ::= "throw"
TRY ::= "try"
TRUE ::= "true"
NUL ::= "undefined"
VAR ::= "var"
WHILE ::= "while"
YIELD ::= "yield"
@Kray-G
Copy link
Owner

Kray-G commented Nov 17, 2021

Thanks for your report. I feel it is very useful to see the Grammar on Railroad Diagram. But I am afraid, can I ask what you would like me to do? Is it right that you want me to implement something into Kinx?

I am very sorry that I have not get what you meant. If it's doable for me, I will try it in the future.

@mingodad
Copy link
Author

I've just added this project grammar to https://mingodad.github.io/parsertl-playground/playground/ a Yacc/Lex online editor/tester (select Kinx parser (partially working) from Examples then click Parse to see a parse tree for the content in Input source).

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

2 participants