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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...