GaijinEntertainment / daScript

daslang - high-performance statically strong typed scripting language
https://daslang.io
BSD 3-Clause "New" or "Revised" License
902 stars 100 forks source link

Grammar railroad diagram #143

Closed mingodad closed 2 years ago

mingodad commented 3 years ago

Using this tool https://www.bottlecaps.de/convert/ (commenting the frist line of ds_parser.ypp) and manually adding the tokens from ds_lexer.lpp we can see a railroad diagram for the grammar in ds_parser.ypp copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui in the tab Edit Grammar then switching to the tab View Diagram.

/* converted on Sun Jul 11, 2021, 19:42 (UTC+02) by bison-to-w3c v0.51 which is Copyright (c) 2011-2021 by Gunther Rademacher <grd@gmx.net> */

program  ::= ( module_declaration | structure_declaration | enum_declaration | global_let | global_function_declaration | expect_declaration | require_declaration | options_declaration | alias_declaration | variant_alias_declaration | bitfield_alias_declaration | ';' )*
module_declaration
         ::= DAS_MODULE NAME optional_shared
character_sequence
         ::= STRING_CHARACTER+
string_constant
         ::= BEGIN_STRING character_sequence END_STRING
string_builder
         ::= BEGIN_STRING ( character_sequence | BEGIN_STRING_EXPR expr END_STRING_EXPR )* END_STRING
expr_reader
         ::= '%' name_in_namespace STRING_CHARACTER+
options_declaration
         ::= DAS_OPTIONS annotation_argument_list
require_declaration
         ::= DAS_REQUIRE require_module
require_module_name
         ::= NAME ( ( '.' | '/' ) NAME )*
require_module
         ::= require_module_name ( DAS_AS NAME )? is_public_module
is_public_module
         ::= DAS_PUBLIC?
expect_declaration
         ::= DAS_EXPECT expect_error ( ',' expect_error )*
expect_error
         ::= INTEGER ( ':' INTEGER )?
expression_label
         ::= DAS_LABEL INTEGER ':'
expression_goto
         ::= DAS_GOTO ( DAS_LABEL INTEGER | expr )
elif_or_static_elif
         ::= DAS_ELIF
           | DAS_STATIC_ELIF
if_or_static_if
         ::= DAS_IF
           | DAS_STATIC_IF
expression_if_then_else
         ::= if_or_static_if expr expression_block ( elif_or_static_elif expr expression_block )* ( DAS_ELSE expression_block )?
expression_for_loop
         ::= DAS_FOR variable_name_with_pos_list DAS_IN expr_list ';' expression_block
expression_unsafe
         ::= DAS_UNSAFE expression_block
expression_while_loop
         ::= DAS_WHILE expr expression_block
expression_with
         ::= DAS_WITH expr expression_block
annotation_argument_value
         ::= string_constant
           | NAME
           | INTEGER
           | FLOAT
           | DAS_TRUE
           | DAS_FALSE
annotation_argument
         ::= NAME ( '=' ( string_constant | NAME | INTEGER | FLOAT | DAS_TRUE | DAS_FALSE | '(' annotation_argument_value ( ',' annotation_argument_value )* ')' ) )?
annotation_argument_list
         ::= annotation_argument ( ',' annotation_argument )*
annotation_declaration_name
         ::= name_in_namespace
           | DAS_REQUIRE
           | DAS_PRIVATE
annotation_declaration
         ::= annotation_declaration_name ( '(' annotation_argument_list ')' )?
annotation_list
         ::= annotation_declaration ( ',' annotation_declaration )*
optional_annotation_list
         ::= ( '[' annotation_list ']' )?
optional_function_argument_list
         ::= ( '(' ( function_argument_declaration ( ';' function_argument_declaration )* )? ')' )?
optional_function_type
         ::= ( ':' type_declaration )?
function_name
         ::= NAME
           | DAS_OPERATOR ( '!' | '~' | ADDEQU | SUBEQU | MULEQU | DIVEQU | MODEQU | ANDEQU | OREQU | XOREQU | ANDANDEQU | OROREQU | XORXOREQU | ANDAND | OROR | XORXOR | '+' | '-' | '*' | '/' | '%' | '<' | '>' | EQUEQU | NOTEQU | LEEQU | GREQU | '&' | '|' | '^' | ADDADD | SUBSUB | SHL | SHR | SHLEQU | SHREQU | ROTL | ROTR | ROTLEQU | ROTREQU )
           | ( ADDADD | SUBSUB ) DAS_OPERATOR
global_function_declaration
         ::= optional_annotation_list DAS_DEF function_declaration
function_declaration_header
         ::= function_name optional_function_argument_list optional_function_type
function_declaration
         ::= function_declaration_header expression_block
expression_block
         ::= '{' expressions '}' ( DAS_FINALLY '{' expressions '}' )?
expression_any
         ::= ( expr_assign | expression_delete | expression_break | expression_continue | expression_label | expression_goto | DAS_PASS )? ';'
           | expr_pipe
           | expr_assign_pipe
           | expression_let
           | expression_while_loop
           | expression_unsafe
           | expression_with
           | expression_for_loop
           | expression_return
           | expression_yield
           | expression_if_then_else
           | expression_try_catch
expressions
         ::= ( expression_any | error )*
expr_pipe
         ::= ( expr_assign LBPIPE | LAPIPE | LFPIPE ) expr_block
name_in_namespace
         ::= ( NAME? COLCOL )? NAME
expression_delete
         ::= DAS_DELETE expr
expr_new ::= DAS_NEWT ( type_declaration ( '(' expr_list? ')' )? | make_decl )
expression_break
         ::= DAS_BREAK
expression_continue
         ::= DAS_CONTINUE
expression_return
         ::= DAS_RETURN ( expr? ';' | LARROW ( expr ';' | expr_pipe ) | expr_pipe )
expression_yield
         ::= DAS_YIELD LARROW? ( expr ';' | expr_pipe )
expression_try_catch
         ::= DAS_TRY expression_block DAS_CATCH expression_block
kwd_let  ::= DAS_LET
           | DAS_VAR
expression_let
         ::= kwd_let let_variable_declaration
expr_cast
         ::= ( DAS_CAST | DAS_UPCAST | DAS_REINTERPRET ) '<' type_declaration '>' expr
expr_type_decl
         ::= DAS_TYPE '<' type_declaration '>'
expr_type_info
         ::= DAS_TYPEINFO '(' name_in_namespace ( '<' NAME ( ';' NAME )? '>' )? expr ')'
expr_list
         ::= expr ( ',' expr )*
block_or_simple_block
         ::= expression_block
           | MAPTO LARROW? expr
block_or_lambda
         ::= '$'
           | '@' '@'?
capture_entry
         ::= ( '&' | '=' | LARROW | CLONEEQU ) NAME
optional_capture_list
         ::= ( BRABRAB capture_entry ( ',' capture_entry )* ']' ']' )?
expr_block
         ::= expression_block
           | block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type block_or_simple_block
expr_numeric_const
         ::= INTEGER
           | UNSIGNED_INTEGER
           | LONG_INTEGER
           | UNSIGNED_LONG_INTEGER
           | FLOAT
           | DOUBLE
expr_assign
         ::= expr ( ( '=' | LARROW | CLONEEQU | ANDEQU | OREQU | XOREQU | ANDANDEQU | OROREQU | XORXOREQU | ADDEQU | SUBEQU | MULEQU | DIVEQU | MODEQU | SHLEQU | SHREQU | ROTLEQU | ROTREQU ) expr )?
expr_assign_pipe
         ::= expr ( '=' | LARROW ) ( LAPIPE | LFPIPE ) expr
expr_named_call
         ::= name_in_namespace '(' '[' make_struct_fields ']' ')'
expr_method_call
         ::= expr RARROW NAME '(' expr_list? ')'
func_addr_expr
         ::= '@' '@' ( '<' ( type_declaration | optional_function_argument_list optional_function_type ) '>' )? name_in_namespace
expr_field
         ::= expr '.' ( NAME | error )
expr     ::= DAS_NULL
           | name_in_namespace
           | expr_numeric_const
           | expr_reader
           | string_builder
           | make_decl
           | DAS_TRUE
           | DAS_FALSE
           | expr_field
           | '!' expr
           | '~' expr
           | '+' expr
           | '-' expr
           | expr SHL expr
           | expr SHR expr
           | expr ROTL expr
           | expr ROTR expr
           | expr '+' expr
           | expr '-' expr
           | expr '*' expr
           | expr '/' expr
           | expr '%' expr
           | expr '<' expr
           | expr '>' expr
           | expr EQUEQU expr
           | expr NOTEQU expr
           | expr LEEQU expr
           | expr GREQU expr
           | expr '&' expr
           | expr '|' expr
           | expr '^' expr
           | expr ANDAND expr
           | expr OROR expr
           | expr XORXOR expr
           | ADDADD expr
           | SUBSUB expr
           | expr ADDADD
           | expr SUBSUB
           | '(' expr ')'
           | expr '[' expr ']'
           | expr QBRA expr ']'
           | expr QDOT NAME
           | func_addr_expr
           | name_in_namespace '(' ')'
           | name_in_namespace '(' expr_list ')'
           | basic_type_declaration '(' ')'
           | basic_type_declaration '(' expr_list ')'
           | '*' expr
           | DAS_DEREF '(' expr ')'
           | DAS_ADDR '(' expr ')'
           | DAS_GENERATOR '<' type_declaration '>' optional_capture_list '(' ')'
           | DAS_GENERATOR '<' type_declaration '>' optional_capture_list '(' expr ')'
           | expr QQ expr
           | expr '?' expr ':' expr
           | expr DAS_IS DAS_TYPE '<' type_declaration '>'
           | expr DAS_IS NAME
           | expr DAS_AS NAME
           | expr '?' DAS_AS NAME
           | expr_type_info
           | expr_type_decl
           | expr_cast
           | expr_new
           | expr_method_call
           | expr_named_call
           | expr_block
           | expr LPIPE expr
           | expr RPIPE expr
           | name_in_namespace NAME
optional_field_annotation
         ::= ( BRABRAB annotation_argument_list ']' ']' )?
optional_override
         ::= DAS_OVERRIDE?
structure_variable_declaration
         ::= optional_field_annotation optional_override variable_declaration
function_argument_declaration
         ::= optional_field_annotation DAS_VAR? variable_declaration
tuple_type
         ::= ( NAME ':' )? type_declaration
variant_type
         ::= NAME ':' type_declaration
variant_type_list
         ::= variant_type ( ';' variant_type )*
copy_or_move
         ::= '='
           | LARROW
variable_declaration
         ::= variable_name_with_pos_list ( '&' | ':' type_declaration ( copy_or_move expr )? | copy_or_move ( expr | expr_pipe ) )?
copy_or_move_or_clone
         ::= '='
           | LARROW
           | CLONEEQU
optional_ref
         ::= '&'?
let_variable_declaration
         ::= variable_name_with_pos_list ( ':' type_declaration ( ';' | copy_or_move_or_clone ( expr ';' | expr_pipe ) ) | optional_ref copy_or_move_or_clone ( expr ';' | expr_pipe ) )
optional_shared
         ::= DAS_SHARED?
optional_shared_or_private
         ::= ( DAS_SHARED | DAS_PRIVATE )?
global_let
         ::= kwd_let optional_shared_or_private ( '{' let_variable_declaration* '}' | let_variable_declaration )
enum_list
         ::= ( NAME ( '=' expr )? ';' )*
single_alias
         ::= NAME '=' type_declaration ';'
alias_declaration
         ::= DAS_TYPEDEF '{' single_alias+ '}'
enum_declaration
         ::= DAS_ENUM NAME ( ':' enum_basic_type_declaration )? '{' enum_list '}'
optional_structure_parent
         ::= ( ':' name_in_namespace )?
structure_name
         ::= NAME optional_structure_parent
class_or_struct
         ::= DAS_CLASS
           | DAS_STRUCT
structure_declaration
         ::= optional_annotation_list class_or_struct structure_name '{' ( ( structure_variable_declaration | '[' annotation_list ']' ) ';' | optional_annotation_list DAS_DEF ( DAS_ABSTRACT function_declaration_header ';' | optional_override function_declaration ) )* '}'
variable_name_with_pos_list
         ::= NAME ( ',' NAME )*
basic_type_declaration
         ::= DAS_TBOOL
           | DAS_TSTRING
           | DAS_TINT
           | DAS_TINT8
           | DAS_TINT16
           | DAS_TINT64
           | DAS_TINT2
           | DAS_TINT3
           | DAS_TINT4
           | DAS_TUINT
           | DAS_TUINT8
           | DAS_TUINT16
           | DAS_TUINT64
           | DAS_TUINT2
           | DAS_TUINT3
           | DAS_TUINT4
           | DAS_TFLOAT
           | DAS_TFLOAT2
           | DAS_TFLOAT3
           | DAS_TFLOAT4
           | DAS_TVOID
           | DAS_TRANGE
           | DAS_TURANGE
           | DAS_TDOUBLE
           | DAS_TBITFIELD
enum_basic_type_declaration
         ::= DAS_TINT
           | DAS_TINT8
           | DAS_TINT16
           | DAS_TUINT
           | DAS_TUINT8
           | DAS_TUINT16
structure_type_declaration
         ::= name_in_namespace
auto_type_declaration
         ::= DAS_TAUTO ( '(' NAME ')' )?
bitfield_bits
         ::= NAME ( ';' NAME )*
bitfield_type_declaration
         ::= DAS_TBITFIELD '<' bitfield_bits '>'
type_declaration
         ::= basic_type_declaration
           | auto_type_declaration
           | bitfield_type_declaration
           | structure_type_declaration
           | type_declaration ( '[' expr? ']' | '-' ( '[' ']' | DAS_CONST | '&' | '#' ) | DAS_EXPLICIT | '='? DAS_CONST | '&' | '#' | DAS_IMPLICIT | '?' | QQ )
           | ( ( ( DAS_SMART_PTR | DAS_ARRAY | DAS_ITERATOR ) '<' | DAS_TABLE '<' type_declaration ';' ) type_declaration | DAS_TTUPLE '<' tuple_type ( ';' tuple_type )* | DAS_TVARIANT '<' variant_type_list ) '>'
           | ( DAS_TBLOCK | DAS_TFUNCTION | DAS_TLAMBDA ) ( '<' ( type_declaration | optional_function_argument_list optional_function_type ) '>' )?
variant_alias_declaration
         ::= DAS_TVARIANT NAME '{' variant_type_list ';' '}'
bitfield_alias_declaration
         ::= DAS_TBITFIELD NAME '{' bitfield_bits ';' '}'
make_decl
         ::= make_struct_decl
           | make_dim_decl
           | make_table_decl
           | array_comprehension
make_struct_fields
         ::= NAME ( copy_or_move | CLONEEQU ) expr ( ',' NAME ( copy_or_move | CLONEEQU ) expr )*
make_struct_dim
         ::= make_struct_fields ( ';' make_struct_fields )*
optional_block
         ::= ( DAS_WHERE expr_block )?
make_struct_decl
         ::= ( BRABRAB type_declaration ( '(' ')' )? make_struct_dim? optional_block ']' | BRACBRB type_declaration ( '(' ')' )? make_struct_dim optional_block '}' ) ']'
make_map_tuple
         ::= expr MAPTO expr
make_any_tuple
         ::= expr ( ',' expr )*
           | make_map_tuple
make_dim ::= make_any_tuple ( ';' make_any_tuple )*
make_dim_decl
         ::= ( BRABRAB type_declaration make_dim ']' | BRACBRB type_declaration make_dim '}' ) ']'
make_table_decl
         ::= CBRCBRB make_map_tuple ( ';' make_map_tuple )* '}' '}'
array_comprehension_where
         ::= ( ';' DAS_WHERE expr )?
array_comprehension
         ::= ( BRABRAB DAS_FOR variable_name_with_pos_list DAS_IN expr_list ';' expr array_comprehension_where ']' | BRACBRB DAS_FOR variable_name_with_pos_list DAS_IN expr_list ';' expr array_comprehension_where '}' ) ']'

// Tokens from ds_lexer.lpp

DAS_FOR ::= "for"
DAS_WHILE ::= "while"
DAS_IF ::= "if"
DAS_STATIC_IF ::= "static_if"
DAS_ELIF ::= "elif"
DAS_STATIC_ELIF ::= "static_elif"
DAS_ELSE ::= "else"
DAS_FINALLY ::= "finally"
DAS_DEF ::= "def"
DAS_WITH ::= "with"
DAS_LET ::= "let"
DAS_VAR ::= "var"
DAS_STRUCT ::= "struct"
DAS_CLASS ::= "class"
DAS_ENUM ::= "enum"
DAS_TRY ::= "try"
DAS_CATCH ::= "recover"
DAS_TYPEDEF ::= "typedef"
DAS_LABEL ::= "label"
DAS_GOTO ::= "goto"
DAS_MODULE ::= "module"
DAS_PUBLIC ::= "public"
DAS_OPTIONS ::= "options"
DAS_OPERATOR ::= "operator"
DAS_REQUIRE ::= "require"
DAS_TBLOCK ::= "block"
DAS_TFUNCTION ::= "function"
DAS_TLAMBDA ::= "lambda"
DAS_GENERATOR ::= "generator"
DAS_TTUPLE ::= "tuple"
DAS_TVARIANT ::= "variant"
DAS_CONST ::= "const"
DAS_CONTINUE ::= "continue"
DAS_WHERE ::= "where"
DAS_CAST ::= "cast"
DAS_UPCAST ::= "upcast"
DAS_PASS ::= "pass"
DAS_REINTERPRET ::= "reinterpret"
DAS_OVERRIDE ::= "override"
DAS_ABSTRACT ::= "abstract"
DAS_EXPECT ::= "expect"
DAS_TABLE ::= "table"
DAS_ARRAY ::= "array"
DAS_ITERATOR ::= "iterator"
DAS_IN ::= "in"
DAS_IMPLICIT ::= "implicit"
DAS_EXPLICIT ::= "explicit"
DAS_SHARED ::= "shared"
DAS_PRIVATE ::= "private"
DAS_SMART_PTR ::= "smart_ptr"
DAS_UNSAFE ::= "unsafe"
DAS_AS ::= "as"
DAS_IS ::= "is"
DAS_DEREF ::= "deref"
DAS_ADDR ::= "addr"
DAS_NULL ::= "null"
DAS_RETURN ::= "return"
DAS_YIELD ::= "yield"
DAS_BREAK ::= "break"
DAS_TYPEINFO ::= "typeinfo"
DAS_TYPE ::= "type"
DAS_NEWT ::= "new"
DAS_DELETE ::= "delete"
DAS_TRUE ::= "true"
DAS_FALSE ::= "false"
DAS_TAUTO ::= "auto"
DAS_TBOOL ::= "bool"
DAS_TVOID ::= "void"
DAS_TSTRING ::= "string"
DAS_TRANGE ::= "range"
DAS_TURANGE ::= "urange"
DAS_TINT ::= "int"
DAS_TINT8 ::= "int8"
DAS_TINT16 ::= "int16"
DAS_TINT64 ::= "int64"
DAS_TINT2 ::= "int2"
DAS_TINT3 ::= "int3"
DAS_TINT4 ::= "int4"
DAS_TUINT ::= "uint"
DAS_TBITFIELD ::= "bitfield"
DAS_TUINT8 ::= "uint8"
DAS_TUINT16 ::= "uint16"
DAS_TUINT64 ::= "uint64"
DAS_TUINT2 ::= "uint2"
DAS_TUINT3 ::= "uint3"
DAS_TUINT4 ::= "uint4"
DAS_TDOUBLE ::= "double"
DAS_TFLOAT ::= "float"
DAS_TFLOAT2 ::= "float2"
DAS_TFLOAT3 ::= "float3"
DAS_TFLOAT4 ::= "float4"

COLCOL ::= "::"
RPIPE ::= "|>"
LBPIPE ::= "<|["
LAPIPE ::= "@<|"
QQ ::= "??"
QBRA ::= "?["

QDOT ::= "?."
CLONEEQU ::= ":="
RARROW ::= "->"
LARROW ::= "<-"
ADDEQU ::= "+="
SUBEQU ::= "-="
DIVEQU ::= "/="
MULEQU ::= "*="
MODEQU ::= "%="
ANDANDEQU ::= "&&="
OROREQU ::= "||="
XORXOREQU ::= "^^="
ANDAND ::= "&&"
OROR ::= "||"
XORXOR ::= "^^"
ANDEQU ::= "&="
OREQU ::= "|="
XOREQU ::= "^="
ADDADD ::= "++"
SUBSUB ::= "--"
LEEQU ::= "<="
GREQU ::= ">="
EQUEQU ::= "=="
NOTEQU ::= "!="
ROTR ::= ">>>"
SHR ::= ">>"
ROTL ::= "<<<"
SHL ::= "<<"
SHREQU ::= ">>="
SHLEQU ::= "<<="
ROTREQU ::= ">>>="
ROTLEQU ::= "<<<="
MAPTO ::= "=>"
BRABRAB ::= "[["
BRACBRB ::= "[{"
CBRCBRB ::= "{{"
borisbat commented 3 years ago

This is really cool. Do you think it should be part of the documentation?

mingodad commented 3 years ago

Yes I think that it can make easier for several people to have a global overview of the language syntax.