ShoneSharp語言(S#)的設計和使用介紹系列(2)— 掀開蓋頭

来源:http://www.cnblogs.com/ShoneSharp/archive/2017/12/02/ShoneSharp-2.html
-Advertisement-
Play Games

瞭解一個語言最好的方式就是在編輯器中按照語法規則輸入代碼,然後運行並查看結果是否符合預期。本博文內容非常重要,承上啟下,不但公開了S#語言的所有武功招式——語法規則,並提供了練功的基礎工具——編輯器,統統都是乾貨呀。 ...


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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Ceph官方版本目前支持的糾刪碼很有限,實驗室這塊希望能夠整合我們自主開發的糾刪碼BRS( " B inary R eed– S olomon encoding" ),所以需要編譯Ceph環境。Ceph官方目前推薦的安裝方式都是通過Ceph deploy的工具來安裝配置,搭建起來十分簡單。目前直接通 ...
  • 1、馮洛伊曼的主要思想: (1)用二進位代碼表示程式和數據; (2)電腦採用存儲程式的工作方式; (3)電腦硬體由存儲器、運算器、控制器、輸入設備和輸出設備等五大部件組成。 2、電腦性能的定義 (1)相應時間(Response Time) 從提出請求到被執行的時間。 (2)吞吐率(Throug ...
  • 在裸板2440中,當我們使用nand啟動時,2440會自動將前4k位元組複製到內部sram中,如下圖所示: 然而此時的SDRAM、nandflash的控制時序等都還沒初始化,所以我們就只能使用前0~4095地址,在前4k地址里來初始化SDRAM,nandflash,初始化完成後,才能將nandflas ...
  • 突然發現VS2017.15.4.5 打開項目特別慢,並且生成項目時也要等上好久好久, 一直以為是vs更新的問題,輾轉半天發現是項目本身原因。 dotnet core 項目下如果出現一個文件夾內包含大量的文件,比如node_modules之類的,會影響dotnet run的運行效率, 解決辦法: cs ...
  • http://www.cnblogs.com/edison1105/archive/2012/07/30/2616082.html 1、首先看一個簡單的例子 大家都知道要實現foreach的必須要實現IEnumerable和IEnumerator的介面,只有實現了它們,才能實現遍歷,所以要講fore ...
  • 在nuget中下載ServiceStack.Redis,但是運行之後會出現一個問題: Exception: “Com.JinYiWei.Cache.RedisHelper”的類型初始值設定項引發異常。System.TypeInitializationException: “Com.JinYiWei. ...
  • data.xml 通過 linq to xml ,查找價格超過10的產品,並列印供應商名稱與產品名稱; 輸出 SupplierName=CD-by-CD-by-Sondheim , ProductName=AssassinsSupplierName=Solely Sondheim , Product ...
  • 瞭解一個語言最好的方式就是在編輯器中按照語法規則輸入代碼,然後運行並查看結果是否符合預期。本博文介紹S#編輯器軟體界面及其相關各模塊的主要功能,並通過通過帶有局部變數的S#代碼來表達和生成幾何圖形,從而說明瞭S#代碼的常用編寫流程。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...