日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MDSF:LOP-使用MPS来做个计算器的示例

發(fā)布時(shí)間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MDSF:LOP-使用MPS来做个计算器的示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  在上一篇面向語言編程LOP(Language Oriented Programming)方法介紹中介紹了LOP以及一種LOP的實(shí)現(xiàn)方法MPS,本篇主要講解一下使用MPS1.5的一個(gè)示例,以便大家能更好的理解是如何使用MPS實(shí)現(xiàn)LOP項(xiàng)目的。

需求

計(jì)算一個(gè)Java/PHP開發(fā)人員的收入,輸入在Java和PHP項(xiàng)目投入的時(shí)間,計(jì)算器自動(dòng)計(jì)算收入值,界面表示如下:

目標(biāo)

通過寫以下4行代碼來生成這個(gè)計(jì)算器(10和5是常量)

?

view sourceprint?
1calculator MySalary
2input PHP Hours
3input Java Hours
4output Java Hours*10 + PHP Hours*5

?

主要步驟

  • 生成前面目標(biāo)中提到的語法的一種語言來實(shí)現(xiàn)計(jì)算器。語言定義基本的邏輯概念、組成規(guī)范、關(guān)系以及各自的行為
  • 生成一個(gè)生成器,定義構(gòu)建swing應(yīng)用程序的規(guī)則
  • 使用我們創(chuàng)建的語言來實(shí)現(xiàn)一個(gè)計(jì)算器
看起來完成這個(gè)示例使用現(xiàn)有語言會(huì)更快些,但是這里我們的意圖是想展示是當(dāng)你如何使用MPS來建立一種特定功能的語言。

下面主要講解一下語言定義部分,代碼生成器部分請(qǐng)參考MPS1.5的示例

生成項(xiàng)目

生成一個(gè)新的項(xiàng)目,項(xiàng)目名為:calculator

按Next后,生成一種新的語言,設(shè)定語言命名空間為:?jetbrains.mps.tutorial.calculator(命名空間一般為companyName.meaningful.name)

再按Next,生成一種新的方案(方案是一套特定語言的模型):

理想情況下,語言和使用語言的方案是分離的兩個(gè)項(xiàng)目,但是建議在生成語言時(shí)把這個(gè)項(xiàng)目放在一起,便于測試新的語言。

按Finish后進(jìn)入項(xiàng)目視圖,默認(rèn)展開語言項(xiàng)目jetbrains.mps.tutorial.calculator()節(jié)點(diǎn):

語言項(xiàng)目下有多個(gè)節(jié)點(diǎn),這些節(jié)點(diǎn)前面都帶有M圖標(biāo),分別代表模型的不同方面:

  • structure:描述語言語法
  • editor:描述編寫語言時(shí)的編輯器
  • constraints:描述一些約束
  • type system:描述如何計(jì)算節(jié)點(diǎn)類型

jetbrains.mps.tutorial.calculator.sandbox()表示我們的測試方案節(jié)點(diǎn),Modules Pool() 包含一系列可以參考使用的語言和方案,后面會(huì)再介紹這些內(nèi)容。

?

下面我們開始來建立Calculator語言

Calculator概念(concept)

就像類定義它的實(shí)例字段、方法和其他成員的結(jié)構(gòu)一樣,概念定義它的實(shí)例屬性、引用和子概念定義的結(jié)構(gòu)。概念是可以繼承的,缺省每一個(gè)概念都從BaseConcept繼承下來,它將會(huì)繼承父概念的所有屬性、子概念和引用等結(jié)構(gòu)。

  首先我們需要生成一個(gè)新的概念:Calculator。設(shè)置instance can be roottrue,實(shí)現(xiàn)INamedConcepts接口以便具有Name屬性,

?

提示:Tab/Shift+Tab可以導(dǎo)航編輯焦點(diǎn)<> ;按Ctrl+Space可以打開自動(dòng)完成提示列表

生成一個(gè)編輯器

  MPS編輯器看上去是文本編輯器,但是它是一個(gè)直接使用語法樹的一個(gè)結(jié)構(gòu)化編輯器。編輯器使用單元格(cells)來表示概念節(jié)點(diǎn),這里有以下幾種節(jié)點(diǎn)類型:

  • 屬性單元格: 編輯節(jié)點(diǎn)屬性
  • 常量單元格:顯示常量值
  • 集合單元格:在內(nèi)部嵌套其他單元格

前面定義了概念calculator,它的編輯器應(yīng)該為:calculator name

選擇Calculator概念的【Editor】頁簽,新增一個(gè)概念編輯器,

  • 添加一個(gè)縮進(jìn)集合類型編輯器:[-
  • 輸入常量:calculator
  • 建立一個(gè)屬性單元格編輯器
    在‘calculator’常量單元格編輯器后按Enter鍵,通過‘{’選擇屬性name:{name}
  • 測試一下概念編輯器

      在語言項(xiàng)目中,點(diǎn)擊右鍵選擇 Generate Language 來生成語言。生成之后,我們?cè)诜桨疙?xiàng)目新建一個(gè)模型:

    Model name中輸入類型 jetbrains.mps.tutorial.calculator.sandbox

    jetbrains.mps.tutorial.calculator語言加入到Model Properties對(duì)話框的Used Languages中,這樣才能使用這個(gè)語言來編寫應(yīng)用:

    在測試模型sandbox中新建一個(gè)Calculator概念測試應(yīng)用,顯示如下:

    ?

    到現(xiàn)在我們已經(jīng)簡單建立了第一條語言,下面建立輸入字段概念

    給Calculator加上子概念I(lǐng)nputField

    新建一個(gè)InputField概念,設(shè)置instance can be rootfalse,實(shí)現(xiàn)INamedConcepts接口以便具有Name屬性,然后再生成編輯器:[- input { name } -]

    為了使得計(jì)算器包含輸入字段,需要把InputField類型作為Calculator概念子對(duì)象:

    選擇在Calculator編輯器中的屬性name,按Alt+Enter彈出意圖列表,選擇Add New Line

    為了每個(gè)輸入字段顯示一行,我們可以對(duì)子對(duì)象InputField選擇Add newline for children意圖:

    Ctrl+F9重新生成語言后,再次進(jìn)入應(yīng)用界面:

    輸出概念:OutputField

    生成一個(gè)默認(rèn)的輸出概念:OutputField,編輯器如下:

    把OutputField添加到calculator概念子對(duì)象中:

    Calculator編輯器更改如下:

    現(xiàn)在我們能夠在outfield中輸入任何表達(dá)式:

    添加表達(dá)式支持

    MPS中有基礎(chǔ)語言,新的語言使用它們需要讓自己的語言擴(kuò)展基礎(chǔ)語言。現(xiàn)在我們需要使用表達(dá)式功能,打開語言屬性對(duì)話框:

    Dependencies 頁簽中的Extended Languages 列表選擇jetbrains.mps.baseLanguage:

    BaseLanguage包含一個(gè)Expression概念,它表示一個(gè)表達(dá)式,格式如"2", "2+3", "abc+abc"等。這個(gè)就是我們這里示例中output需要的。

    現(xiàn)在給OutputField添加expression子類型:

    更改編輯器:

    現(xiàn)在可以輸入表達(dá)式,但是還不能通過input計(jì)算,應(yīng)用界面如下:

    擴(kuò)展表達(dá)式概念

    為了支持通過input來計(jì)算,我們需要生成自己的表達(dá)式類型。建立概念InputFieldReference,從Expression繼承下來,添加InputField為引用概念field

    生成InputFieldReference編輯器:%field%-> {name}表示引用概念屬性

    應(yīng)用界面如下:MPS的智能引用會(huì)在當(dāng)前上下文決定哪些引用可以使用,這里自動(dòng)完成列表會(huì)列出width

    定義生成器

      MPS生成器語言使用兩種參數(shù)引用:property macros (marked with $) andnode macros ($$)。

      我更關(guān)注的是前面語言定義部分,這部分還沒有具體看,剛興趣的可以參考MPS1.5的示例

    ?

    ?

    MPS網(wǎng)站

    ?Download MPS

    ?A Language Workbench in Action - MPS

    ?

    歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載自周金根 [ http://zhoujg.cnblogs.com/ ]

    轉(zhuǎn)載于:https://blog.51cto.com/zhoujg/517108

    總結(jié)

    以上是生活随笔為你收集整理的MDSF:LOP-使用MPS来做个计算器的示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 2019中文字幕在线视频 | 啊灬啊灬啊灬秀婷 | 国产一级黄色大片 | 亚洲精选一区二区三区 | 成年人免费黄色片 | 成人av地址| 国产精品精东影业 | 欧美视频在线观看免费 | 亚洲综合社区 | 国产欧美一区二区在线观看 | www.日本色| 一区二区三区国产av | 正在播放经典国语对白 | 亚洲三级图片 | 日韩欧美一区二区免费 | 野花视频在线免费观看 | 91蜜桃在线 | 亚洲欧洲成人精品久久一码二码 | 日本三级吹潮 | 国产精品一区2区 | 少妇精品 | 国产精品无码一区二区三 | 麻豆影视在线免费观看 | 国内自拍小视频 | 在线观看日韩中文字幕 | caoporn成人 | 毛片在线网站 | 日日热| 国产女教师bbwbbwbbw | 99国产精品白浆在线观看免费 | 亚洲在线不卡 | 亚洲色图国产视频 | 日本猛少妇色xxxxx猛叫 | 一级肉体全黄裸片中国 | 在线尤物| 美女的隐私免费看 | 国产一区二区视频免费在线观看 | 国产精品99久久久久久人 | 精品福利三区3d卡通动漫 | 中文字幕在线免费看线人 | 欧美亚洲二区 | 国产不卡免费视频 | 大尺度做爰呻吟舌吻情头 | 色777| 欧美一区二区三区大屁股撅起来 | 精人妻一区二区三区 | 亚洲一区二区中文字幕 | 欧美被狂躁喷白浆精品 | 精品成人无码一区二区三区 | 变态另类一区 | 国产人妻精品一区二区三区 | 成人精品一区二区 | 亚洲一区激情 | 久久日本精品字幕区二区 | 美女在线不卡 | 欧美一区二区二区 | 成人一区在线观看 | 天天看片中文字幕 | 日韩有码在线观看 | 男人久久| 波多野吉衣av在线 | 久久靠逼视频 | 91精品国产手机 | www.白白色| 亚洲毛片视频 | 毛片av在线观看 | 91美女网站 | 日产精品一区二区 | 亚洲va国产va天堂va久久 | 欧美精品1区 | 欧美老女人性生活视频 | 天天弄天天操 | 日日操日日爽 | 欧美性受xxxxxx黑人xyx性爽 | 波多野结衣黄色 | 国产一区在线免费观看 | 日本一区二区三区电影在线观看 | 一级空姐毛片 | 成人综合婷婷国产精品久久 | 五十路中文字幕 | 欧美视频第一区 | 中文 日韩 欧美 | wwwsss在线观看 | 激情五月五月婷婷 | 日本第一页 | 国产日产亚洲系列最新 | 久久国产人妻一区二区免色戒电影 | 青青草国产精品视频 | 日韩欧美在线第一页 | 污污av| 亚洲自拍偷拍网 | 欧美大片在线看 | 午夜视频91 | 综合网激情 | 女同性恋一区二区三区 | 色网综合 | 亚洲国产综合网 | 国产精品久久久久久久久久久久久久久久 | 久久久精品中文字幕麻豆发布 |