热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ShoneSharp语言(S#)的设计和使用介绍系列(2)—掀开盖头

ShoneSharp语言(S#)的设计和使用介绍系列(2)—掀开盖头作者:Shone声明:原创文章欢迎转载,但请注明出处。摘要:了解一个语言最


ShoneSharp语言(S#)的设计和使用介绍

系列(2)— 掀开盖头

作者:Shone

声明:原创文章欢迎转载,但请注明出处。

摘要: 了解一个语言最好的方式就是在编辑器中按照语法规则输入代码,然后运行并查看结果是否符合预期。本博文内容非常重要,承上启下,不但公开了S#语言的所有武功招式——语法规则,并提供了练功的基础工具——编辑器,统统都是干货呀。


一、S#语言揭秘

前面开篇对S#语言进行开宗明义,那么S#语言到底长怎样?是不是那回事?

今天就是来回答这个问题。

S#语言其实前期是个人业余开发的软件产品的一个核心组件,在不断使用中添加功能特性并进行优化,至今词法、语法、语义以及基础类库已比较稳定。开发过程中也深深感受到一个人的力量真的很有限,而S#语言本身架构其实很宏伟,完全可以有更好的发展。今天把之公之于众,就是想把S#语言已有的功能介绍出来,让大家交流和讨论一下,这个语言生命力如何,是否有必要存在下去?可否通过开源力量或其他方式进行发展和壮大?

了解一个语言最好的方式就是在编辑器中按照语法规则输入代码,然后运行并查看结果是否符合预期。下面就公开S#语言的所有武功招式——语法规则,并提供了练功的基础工具——编辑器。语法规则采用Gold Parsing System(http://goldparser.org/)进行定义,高手请详细研究一下,其他人可略过本节,前去下载编辑器。

S#语言秘笈:

"Name"    = 'S# Grammar'

"Version" = '2017.12.1'

"Author"  = 'Shone'

"About"   = 'ShoneSharp Language Grammar'

"Case Sensitive" = True

"Start Symbol"   =

 

{IdName Head}  = {Letter} + [_]

{IdName Tail}  = {IdName Head} + {Digit}

{Hex}          = {Digit} + ['A''B''C''D''E''F''a''b''c''d''e''f''_']

{Charx}        = {Printable} - ['`'] + {Whitespace}

{Chars}        = {Printable} - [''] + {Whitespace}

{Chars1}       = {Printable} - ['"''\'] + {Whitespace}

{Chars2}       = {Printable} - ['"'] + {Whitespace}

Number         = {Digit}*'.'?{Digit}+(['E''e']['+''-']?{digit}+)? | '0x'{Hex}+

IdName         = {IdName Head}{IdName Tail}* | '`'({Charx} | '`''`')*'`' | '@para' | '@eval' | '@if'| '@case'| '@switch'| '@each'| '@eachx'| '@for'| '@forx'| '@dup'| '@dupx'| '@iter'| '@do'| '@sum'| '@prod'| '@integal'| '@load'| '@parse'| '@call'| '@func'| '@class'| '@foreach'| '@while'| '@var'| '@default'| '@return'| '@break'| '@continue' | '@in' | '@else' | '@true' | '@false' | '@null' | '@local' | '@parent' | '@this' | '@base' | '@host'| '@import' | '@include'

String         = ''({Chars} | '''')*''

String1        = '"'({Chars1} | '\'{Printable})*'"'

String2        = '@''"'({Chars2} | '"''"')*'"'

Comment Line   = '//'

Comment Start  = '/*'

Comment End    = '*/'

OpRange        = '.$' | '.~' | '.<' | '.>' | '.#'

OpRef          = '.' | '@.' | '?.' | '?@.'

Each           = 'each' | 'eachx'

Dup            = 'dup' | 'dupx'

For            = 'for' | 'forx'

Equal          = '=' | '@=' | '=:' | '=@' | ':=' | ':@=' | ':=:' | '@=@' | '::' | '@@'

 

      ::= '===' '==='

        ::=

               |

         ::= '#1'

               | '#1'

        ::=

               |

         ::= '#2'

               | '#2'             

        ::=

               |

         ::= '#3'

               | '#3'

        ::=

               |

         ::= '#4'

               | '#4'

        ::=

               |

         ::= '#5'

         ::= IdName ':'

               |

         ::= IdName ':'

               |

              

       ::= '---' '---'

         ::=

               |

          ::= '#1'

 

::= '{' '}'                      

::=

             |

::= IdName '{' '}'

             | IdName '{' '}'

             | IdName '{' '}'

             | IdName

             | '<' IdName '/>'

             | '<' IdName '/>'

             | '<' IdName '/>'

             | '<' IdName '/>'

              

  ::=

               |

              

::= '{' '}'              

::=

               |

                  

     ::=

               | 'case' ':'

               | 'default' ':'

               | 'if' '(' ')'

               | 'if' '(' ')' else

               | 'if' '(' ')' else

               | 'for' '(' 'var' ';' ';' ')'

               | 'foreach' '(' 'var' IdName 'in' ')'

               | 'while' '(' ')'

               | 'do' 'while' '(' ')' ';'

               | 'switch' '(' ')' 

               |

              

   ::= '{' '}'                     

    ::=

               |

              

     ::=

               | ';'

               | 'func' ';'

               | 'var' ';'

               | 'import' ';'

                              

  ::= 'class' IdName

               | 'class' IdName ':' IdName

               | 'func' IdName '(' ')'

               | 'func' IdName '(' ')'

               | 'func' IdName '(' ')'

                    

   ::= ';'

               | 'return' ';'

               | 'break' ';'

               | 'continue' ';'

                             

::= ','

               |

              

::=

               |

               |

               |

 

   ::= 'class'

               | 'class' IdName ':' IdName '{' '}'

              

    ::= IdName '(' ')' Equal

               | IdName '(' ')' Equal

               | IdName '(' ')' Equal

              

     ::= IdName '+='

               | IdName '-='

               | IdName '*='

               | IdName '/='

               | IdName '++'

               | IdName '--'

               |

              

  ::=

               |

              

   ::= ','

               |

              

     ::=   ':'

               | IdName Equal

 

    ::= ','

               |

        ::= IdName '@'

 

   ::= ','

               |

              

       ::= '->'

 

  ::= ','

               |

      ::= IdName

 

 

     ::= IdName

               |

 

  ::= ';'

               |

 

::= ','

               |

                           

    ::= IdName '=>'

               | '(' ')' '=>'

               | 'func' '(' ')' '=>'

               | 'func' '(' ')' '=>'

               |

 

::= '||'

               |

 

   ::= '&&'

               |

 

   ::= '=='

               | '!='

               |

 

   ::= '<'

               | '>'

               | '<='

               | '>='

               |

 

       ::= '+'

               | '-'

               |

 

   ::= '*'

               | '/'

               | '%'

               |

 

   ::= '^'

               | '$'

               | '#'

               | '&'

               | '|'

               | '$$'

               | '##'

               | '??'

               |   '..'

               |   '...'

               |   '..' OpRange

               |   '...' OpRange

               |

 

    ::= '!'

               | '-'

               | '~'

               | '?'

               | '$'

               | '*'

               | '&'

               |

 

   ::= '[' ']'

               | '[' ':' ']'

               | Number

               | OpRef IdName

               | OpRef IdName '(' ')'

               | OpRef IdName '(' ')'

               |             

 

    ::= '(' ')'

               | '(' ')'

               | '(' ')'

               |

          

      ::= Number

               |

               |

               | IdName

               | '(' ')'

               | '[' ']'

               | '{' '}'

               | '{' '}'

               | '[' ']'

               | '{' '}'

               | '{-}'

               | ''

               | '(' ')'

               | '(' ')'

               | '(' ',' ')'

               | '(' ',' ',' ')'

               | '<' ',' '>'

               | '<' ',' ',' '>'

               | 'load' '(' ')'

               | 'parse' '(' ')'

               | 'call' '(' ')'

               | 'eval' '(' ':' ')'

               | 'para' '(' ':' ')'

               | 'func' '(' ':' ')'

               | 'func' '(' ':' ')'

               | 'class' '{' '}'

               | 'class' ':' IdName '{' '}'

               | 'if' '(' '?' ':' ')'

               | 'case' '(' '?' ':' ')'

               | 'switch' '(' '?' ':' ')'

               | Each '(' ':' ')'

               | Each '(' ';' ':' ')'

               | Each '(' IdName ':' ':' ')'

               | Dup '(' ':' ')'

               | 'iter' '(' ';' ':' ')'

               | 'iter' '(' ';' IdName ':' ':' ')'

               | For '(' ';' ';' ':' ')'

               | 'do' '(' ';' ';' ';' ':' ')'

               | 'sum' '(' ',' ':' ')'

               | 'prod' '(' ',' ':' ')'

               | 'integal' '(' ',' ':' ')'

               | 'include'

               |

               |

               |

               |

              

        ::= 'null'

               | 'true'

               | 'false'

               | 'local'

               | 'parent'

               | 'this'

               | 'base'

               | 'host'

                             

        ::= String

               | String1

               | String2

二、S#编辑器

上面语法看不懂,没关系,本系列将会在后续博文进行详细解释。说了半天,其他语言都有IDE,S#语言也不例外,提供集成编辑、解析和运行一体的软件工具,简称S#编辑器,文件名为ShoneSharp.exe。

是驴是马拉出来溜溜的时候到了,围观的观众也可以准备好口水或板砖了。

1) 软件下载

S#语言编辑解析运行器为Shone的原创软件,运行环境.NET 4.0,为绿色软件可直接拷贝运行,单个EXE文件无任何依赖,无注册表、广告等任何副作用。

网盘下载链接为https://pan.baidu.com/s/1dF4e08p

说明一下,ShoneSharp.exe大小接近6M,核心其实只有2M左右,其他主要为语法着色、二维显示、智能帮助等高级功能。这是目前暂时从本人已有软件产品中完全剥离出来的可独立运行功能,其实还是依赖了.NET的WPF界面库,将来如果开源的话,可能还要进行组件拆分,尽量把非界面部分全部基于最新的.NET Standard 2.0开发,以便能够实现跨平台,这是后话。

2) 软件界面

经典语言的入门程序都是编写HelloWorld,那么在S#语言中是啥样?运行S#编辑器软件,输入"Hello, world. 您好,我来了!",右下角就直接显示代码的运行结果,如果是几何代码还可以看到相应图形,如下图。

                       

什么没有print,没有Console.Write,怎么能输出呢?这里再强调一下,S#语言最有特色的地方就是“数据即程序、程序即数据”,这点和LISP有点像,不过LISP采用(前缀表达,S#语言则采用惯用表达,前缀、中缀、后缀怎么方便怎么来。

由于本博有点长了,编辑器详细功能介绍放到下一节再介绍。有兴趣的观众可以先下载软件试试玩一下,应该还是比较简单容易上手。


推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
author-avatar
试管婴儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有