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

系列(2)— 掀开盖头

作者:Shone

声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp。

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

软件: S#语言编辑解析运行器,运行环境.NET 4.0,绿色软件,单个EXE直接运行,无副作用。网盘下载链接为https://pan.baidu.com/s/1dF4e08p

一、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"   = <Output>

{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          = '=' | '@=' | '=:' | '=@' | ':=' | ':@=' | ':=:' | '@=@' | '::' | '@@'

<LData>      ::= '===' <L1s> '==='

<L1s>        ::= <L1> <L1s>

| <L1>

<L1>         ::= '#1' <Lb> <L2s>

| '#1' <La>

<L2s>        ::= <L2> <L2s>

| <L2>

<L2>         ::= '#2' <Lb> <L3s>

| '#2' <La>

<L3s>        ::= <L3> <L3s>

| <L3>

<L3>         ::= '#3' <Lb> <L4s>

| '#3' <La>

<L4s>        ::= <L4> <L4s>

| <L4>

<L4>         ::= '#4' <Lb> <L5s>

| '#4' <La>

<L5s>        ::= <L5> <L5s>

| <L5>

<L5>         ::= '#5' <La>

<Lb>         ::= IdName ':'

| <La>

<La>         ::= IdName ':' <Output>

| <Output>

<Data>       ::= '---' <Ls> '---'

<Ls>         ::= <L> <Ls>

| <L>

<L>          ::= '#1' <Arraylist>

<Instanceblk>::= '{' <Instances> '}'

<Instances> ::= <Instance> <Instances>

| <Instance>

<Instance> ::= IdName '{' '}'

| IdName '{' <Proplist1> '}'

| IdName '{' <Proplist1> '}' <Instanceblk>

| IdName <Instanceblk>

| '<' IdName '/>'

| '<' IdName <Proplist1> '/>'

| '<' IdName <Proplist1> '/>' <Instanceblk>

| '<' IdName '/>' <Instanceblk>

<Statement>  ::= <Clauseblock>

| <Clause>

<Clauseblock>::= '{' <Clauselist> '}'

<Clauselist> ::= <Clause> <Clauselist>

| <Clause>

<Clause>     ::= <Define>

| 'case' <Formula> ':'

| 'default' ':'

| 'if' '(' <Expression> ')' <Statement>

| 'if' '(' <Expression> ')' <Sentence> else <Statement>

| 'if' '(' <Expression> ')' <Clauseblock> else <Statement>

| 'for' '(' 'var' <Proplist> ';' <Expression> ';' <Changelist> ')' <Statement>

| 'foreach' '(' 'var' IdName 'in' <Arraylist> ')' <Statement>

| 'while' '(' <Expression> ')' <Statement>

| 'do' <Statement> 'while' '(' <Expression> ')' ';'

| 'switch' '(' <Formula> ')'  <Clauseblock>

| <Sentence>

<Defblock>   ::= '{' <Deflist> '}'

<Deflist>    ::= <Define> <Deflist>

| <Define>

<Define>     ::= <Defclause>

| <Defclass> ';'

| 'func' <Deffunc> ';'

| 'var' <Assign> ';'

| 'import' <Str> ';'

<Defclause>  ::= 'class' IdName <Defblock>

| 'class' IdName ':' IdName <Defblock>

| 'func' IdName '(' ')' <Clauseblock>

| 'func' IdName '(' <Paramlist> ')' <Clauseblock>

| 'func' IdName '(' <Proplist> ')' <Clauseblock>

<Sentence>   ::= <Change> ';'

| 'return' <Formulalist> ';'

| 'break' ';'

| 'continue' ';'

<Changelist> ::= <Changenode> ',' <Changelist>

| <Changenode>

<Changenode> ::= <Defclause>

| <Defclass>

| <Deffunc>

| <Change>

<Defclass>   ::= 'class' <Instance>

| 'class' IdName ':' IdName '{' <Proplist> '}'

<Deffunc>    ::= IdName '(' ')' Equal <Formula>

| IdName '(' <Paramlist> ')' Equal <Formula>

| IdName '(' <Proplist> ')' Equal <Formula>

<Change>     ::= IdName '+=' <Math>

| IdName '-=' <Math>

| IdName '*=' <Math>

| IdName '/=' <Math>

| IdName '++'

| IdName '--'

| <Assign>

<Proplist1>  ::= <Assign> <Proplist1>

| <Assign>

<Proplist>   ::= <Assign> ',' <Proplist>

| <Assign>

<Assign>     ::= <Str>  ':' <Formula>

| IdName Equal <Formula>

<Eachlist>    ::= <Each> ',' <Eachlist>

| <Each>

<Each>        ::= IdName '@' <Formula>

<Caselist>   ::= <Case> ',' <Caselist>

| <Case>

<Case>       ::= <Formula> '->' <Formula>

<Paramlist>  ::= <Param> ',' <Paramlist>

| <Param>

<Param>      ::= IdName

<Output>     ::= <Arraylist> IdName

| <Arraylist>

<Arraylist>  ::= <Formulalist> ';' <Arraylist>

| <Formulalist>

<Formulalist>::= <Formula> ',' <Formulalist>

| <Formula>

<Formula>    ::= IdName '=>' <Expression>

| '(' ')' '=>' <Expression>

| 'func' '(' <Paramlist> ')' '=>' <Expression>

| 'func' '(' <Proplist> ')' '=>' <Expression>

| <Expression>

<Expression> ::= <Expression> '||' <Operand6>

| <Operand6>

<Operand6>   ::= <Operand6> '&&' <Operand5>

| <Operand5>

<Operand5>   ::= <Operand5> '==' <Operand4>

| <Operand5> '!=' <Operand4>

| <Operand4>

<Operand4>   ::= <Operand4> '<' <Math>

| <Operand4> '>' <Math>

| <Operand4> '<=' <Math>

| <Operand4> '>=' <Math>

| <Math>

<Math>       ::= <Math> '+' <Operand2>

| <Math> '-' <Operand2>

| <Operand2>

<Operand2>   ::= <Operand2> '*' <Operand1>

| <Operand2> '/' <Operand1>

| <Operand2> '%' <Operand1>

| <Operand1>

<Operand1>   ::= <Operand1> '^' <Unarand>

| <Operand1> '$' <Unarand>

| <Operand1> '#' <Unarand>

| <Operand1> '&' <Unarand>

| <Operand1> '|' <Unarand>

| <Operand1> '$$' <Unarand>

| <Operand1> '##' <Unarand>

| <Operand1> '??' <Unarand>

| <Unarand>  '..' <Unarand>

| <Unarand>  '...' <Unarand>

| <Unarand>  '..' <Unarand> OpRange <Unarand>

| <Unarand>  '...' <Unarand> OpRange <Unarand>

| <Unarand>

<Unarand>    ::= '!' <Unarand>

| '-' <Unarand>

| '~' <Unarand>

| '?' <Unarand>

| '$' <Unarand>

| '*' <Unarand>

| '&' <Unarand>

| <Referand>

<Referand>   ::= <Referand> '[' <Formulalist> ']'

| <Referand> '[' <Formula> ':' <Formula> ']'

| <Referand> Number

| <Referand> OpRef IdName

| <Referand> OpRef IdName '(' ')'

| <Referand> OpRef IdName '(' <Formulalist> ')'

| <Calland>

<Calland>    ::= <Calland> '(' ')'

| <Calland> '(' <Formulalist> ')'

| <Calland> '(' <Proplist> ')'

| <Value>

<Value>      ::= Number

| <Key>

| <Str>

| IdName

| '(' <Formula> ')'

| '[' <Formulalist> ']'

| '{' <Arraylist> '}'

| '{' <Proplist> '}'

| '[' ']'

| '{' '}'

| '{-}'

| '</>'

| '(' ')'

| '(' <Proplist1> ')'

| '(' <Math> ',' <Math> ')'

| '(' <Math> ',' <Math> ',' <Math> ')'

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

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

| 'load' '(' <Output> ')'

| 'parse' '(' <Output> ')'

| 'call' '(' <Output> ')'

| 'eval' '(' <Changelist> ':' <Output> ')'

| 'para' '(' <Output> ':' <Proplist> ')'

| 'func' '(' <Paramlist> ':' <Output> ')'

| 'func' '(' <Proplist> ':' <Output> ')'

| 'class' '{' <Proplist> '}'

| 'class' ':' IdName '{' <Proplist> '}'

| 'if' '(' <Expression> '?' <Output> ':' <Output> ')'

| 'case' '(' <Formula> '?' <Caselist> ':' <Output> ')'

| 'switch' '(' <Assign> '?' <Caselist> ':' <Output> ')'

| Each '(' <Eachlist> ':' <Output> ')'

| Each '(' <Eachlist> ';' <Expression> ':' <Output> ')'

| Each '(' IdName ':' <Eachlist> ':' <Output> ')'

| Dup '(' <Eachlist> ':' <Output> ')'

| 'iter' '(' <Assign> ';' <Eachlist> ':' <Change> ')'

| 'iter' '(' <Assign> ';' IdName ':' <Eachlist> ':' <Change> ')'

| For '(' <Changelist> ';' <Expression> ';' <Changelist> ':' <Output> ')'

| 'do' '(' <Assign> ';' <Changelist> ';' <Expression> ';' <Changelist> ':' <Change> ')'

| 'sum' '(' <Assign> ',' <Math> ':' <Output> ')'

| 'prod' '(' <Assign> ',' <Math> ':' <Output> ')'

| 'integal' '(' <Assign> ',' <Math> ':' <Output> ')'

| 'include' <Str>

| <Clauseblock>

| <Instance>

| <LData>

| <Data>

<Key>        ::= 'null'

| 'true'

| 'false'

| 'local'

| 'parent'

| 'this'

| 'base'

| 'host'

<Str>        ::= 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#语言则采用惯用表达,前缀、中缀、后缀怎么方便怎么来。

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

附注:由于初来乍到博客园,园龄太短,关注度太小,如果那位大拿觉得本人系列介绍将会有用,请帮转发或顶一下,在此先谢了:-)

声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp。

软件: S#语言编辑解析运行器,运行环境.NET 4.0,绿色软件,单个EXE直接运行,无副作用。网盘下载链接为https://pan.baidu.com/s/1dF4e08p

ShoneSharp语言(S#)的设计和使用介绍系列(2)— 掀开盖头的更多相关文章

  1. ShoneSharp语言(S#)的设计和使用介绍系列(1)— 开篇

    ShoneSharp语言(S#)的设计和使用介绍 系列(1)- 开篇 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. 一 ...

  2. ShoneSharp语言(S#)的设计和使用介绍系列(4)— 入门概述

    ShoneSharp语言(S#)的设计和使用介绍 系列(4)- 入门概述 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. ...

  3. ShoneSharp语言(S#)的设计和使用介绍系列(3)— 修炼工具

    ShoneSharp语言(S#)的设计和使用介绍 系列(3)- 修炼工具 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. ...

  4. ShoneSharp语言(S#)的设计和使用介绍系列(11)—“类”披炫服靓妆化成“表”

    ShoneSharp语言(S#)的设计和使用介绍 系列(11)—“类”披炫服靓妆化成“表” 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/Sh ...

  5. ShoneSharp语言(S#)的设计和使用介绍系列(10)— 富家子弟“语句“不炫富

    ShoneSharp语言(S#)的设计和使用介绍 系列(10)— 富家子弟“语句“不炫富 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/Sho ...

  6. ShoneSharp语言(S#)的设计和使用介绍系列(9)— 一等公民“函数“爱炫巧

    ShoneSharp语言(S#)的设计和使用介绍 系列(9)— 一等公民“函数“爱炫巧 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/Shon ...

  7. ShoneSharp语言(S#)的设计和使用介绍系列(8)— 最炫“公式”风

    ShoneSharp语言(S#)的设计和使用介绍 系列(8)— 最炫“公式”风 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSha ...

  8. ShoneSharp语言(S#)的设计和使用介绍系列(7)— 布尔Bool及对象Object

    ShoneSharp语言(S#)的设计和使用介绍 系列(7)— 布尔Bool及对象Object 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ ...

  9. ShoneSharp语言(S#)的设计和使用介绍系列(6)— 字符串String

    ShoneSharp语言(S#)的设计和使用介绍 系列(6)— 字符串String 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneS ...

随机推荐

  1. 文本处理工具(grep)

    文本处理工具:     Linux上文本处理三剑客:        文本过滤工具(模式:pattern)工具:          1.grep:支持基本正则表达式;          2.egrep: ...

  2. 开发人员的福音:微软、谷歌、Mozilla将他们所有的web API文档放在同一个地方

    Tips 原文作者:Liam Tung  原文地址:Developers rejoice: Microsoft, Google, Mozilla are putting all their web A ...

  3. LINUX 配置默认程序

    update-alternatives 命令用于配置默认程序,版本切换 1.display 命令,查看命令链接信息 update-alternatives --display name 2.insta ...

  4. react-native绑定优酷SDK播放视频-附效果和git源码

    ReactNative绑定优酷SDK需要用到两部分知识: 优酷本身的sdk绑定: RN与原生界面的交互: 效果: RN版本:0.49.3 代码更新日期:2017.10.26 下文也根据绑定优酷需要的两 ...

  5. maven搭建MVC项目具体步骤

    一.目标 在这篇文章中,我将要向您展示如何使用spring Frameworks 和 Maven build创建您的第一个J2ee 应用程序. 二.信息 Maven是一个Java项目的构建工具(或者自 ...

  6. Spring事务的传播行为和隔离级别

    事物注解方式: @Transactional [一]传播行为: 使用方法:@Transactional(propagation=Propagation.REQUIRED) Require:支持当前事务 ...

  7. Jquery DataTable AJAX跨域请求的解决方法及SSM框架下服务器端返回JSON格式数据的解决方法

    如题,用HBuilder开发APP,涉及到用AJAX跨域请求后台数据,刚接触,费了不少时间.幸得高手指点,得以解决. APP需要用TABLE来显示数据,因此采用了JQ 的DataTable.  在实现 ...

  8. WinForm 菜单控件

    一:MenuStrip 菜单条 MenuStrip 是应用程序菜单条的容器. 二:ToolStripMenuItem 像上面图中, 文件 格式 等这些菜单当中的一级菜单以及文件中的 新建 打开 分割条 ...

  9. 磨刀不误砍柴工!vs2010快捷键大全

    最常用的快捷键: VS2012变化的快捷键: 注释::VS2010是(Ctrl+E,C),VS2012是(Ctrl+K, Ctrl+C),实际操作,按住Ctrl键不放,先按K键,再按C键.相当于Ctr ...

  10. 平衡二叉树(AVL树)

    参考资料 http://www.cnblogs.com/Cmpl/archive/2011/06/05/2073217.html http://www.cnblogs.com/yc_sunniwell ...