1

我设计了一种非常简单的领域特定语言 (DSL) 来指定和执行设备上的全屏交互行为。它是基于事件的动作语言,以 XML 作为载体语法。它的例子在这里:

<state no="15000" >
    <timeout>30</timeout>
    <backgroundactions>
      <as3function name="hideImages">
      </as3function>
    </backgroundactions>
    <screen>
      <components>
        <textfield x="50" y="120" width="924" textsize="50" background="1" border="1">
          <text say="1">
            <part type="text">Who would you like to call?</part>
          </text>          
        </textfield>
        <button label="MENU" width="80" height="30" x="920" y="10" textsize="14" icon="none" adjtext="-5">
          <event name="clicked">
            <action preconditions="no" name="transition">
              <parameter>
                <type>state</type>
                <name>n</name>
                <value>800</value>
              </parameter>
            </action>
          </event>
        </button>
        <button label="My contacts" width="250" height="200" x="212" y="500" textsize="40" icon="iconRight2.png" iconx="65" icony="20" adjtext="35">
          <event name="clicked">
            <action preconditions="no" name="transition">
              <parameter>
                <type>state</type>
                <name>n</name>
                <value>15007</value>
              </parameter>
            </action>
          </event>
        </button>
        <button label="Other" width="250" height="200" x="562" y="500" textsize="40" icon="iconWrong2.png" iconx="65" icony="20" adjtext="35">
          <event name="clicked">
            <action preconditions="no" name="transition">
              <parameter>
                <type>state</type>
                <name>n</name>
                <value>15100</value>
              </parameter>
            </action>
          </event>
        </button>
      </components>
    </screen>
  </state>

它在语义上意味着以下内容: DSL的语义解释

它是一种状态转换语言,程序员在其中以声明方式描述 UI 布局和程序应响应的事件以及流向事件的操作。DSL 是为可读性而设计的。以下是节点的简短描述:

  • timeout:执行每个状态时状态计时器的持续时间
  • 背景动作:这些代表进入状态时执行的动作
  • 状态屏幕:屏幕组件和与之关联的事件
  • expectedevents:当前状态预期的事件。这些是异步事件

有没有办法以更正式的描述将这种特定语言表示为语法或元模型(我不熟悉语言建模技术)。我的想法是为此 DSL 编写语言规范,以便我团队中的其他程序员可以根据该规范生成他们选择的其他语言的脚本,例如 python 或 lua。甚至可能代码生成这个 XML?代表这一点的最佳方式是什么?我一直在使用许多语言工具和 dsl 工具,但我不知道什么对这种语言最有效?有专业知识的人可以帮助我朝着正确的方向前进,并在需要完成的步骤上抢先一步。

4

4 回答 4

3

XML 可以用于实验,但它的冗长使得 DSL 变得很糟糕(并且与 DSL 的目的相反,我会说)。

发明一种最简单、最易读的语言来描述你想要什么,然后使用像 ANTLR、PEGjs、PyParsing、PyPEG 或 Grako 这样的工具来编写语法并为其生成解析器。

其他语言的程序将能够通过使用 DSL 编写的程序传递一个字符串来调用您的运行时。

于 2013-02-02T13:54:46.953 回答
2

使用 DSL 来接近实际的问题域(UI 和相关事件)非常有意义。我知道为某个 UI 指定了几个元模型,例如:手机、运动电脑、汽车信息娱乐系统、各种触摸屏设备和网络应用程序(请参阅http://www.metacase.com/cases/上的一些公共语言dsm_examples-ui.html)。然后可以使用生成器生成实际代码、原型或测试脚本。

要定义这些特定领域的建模语言,您首先要指定元模型,包括概念(例如按钮、转换、状态)和相关规则(例如按下按钮触发转换),然后是一些符号。然后,您可以测试语言以定义示例模型,就像使用 XML 一样,最后准备好一些模型,您可以定义生成预期结果的生成器。通过这种方法,松下、Polar 和 EADS 等公司报告了更好的质量和更快的速度。我亲自参与了几个提供帮助的此类案例,并在http://www.devx.com/enterprise/Article/30550上写了一篇关于语言定义的文章。希望这可以帮助。

于 2013-02-04T21:18:12.563 回答
0

顺便说一句:已经有一个基于 pyPEG 并输出 XML 的 DSL 工具链——它是 YML,http ://fdik.org/yml

也许这符合您的需求。使用 yml2proc -Y 自动转换它是:

state no="15000" {
    timeout > 30
    backgroundactions
        as3function name="hideImages";
    screen {
        components {
            textfield x="50", y="120", width="924", textsize="50", background="1", border="1" {
                text say="1" {
                    part type="text" > Who would you like to call?
                }
            }
            button label="MENU", width="80", height="30", x="920", y="10", textsize="14", icon="none", adjtext="-5" {
                event name="clicked" {
                    action preconditions="no", name="transition" {
                        parameter {
                            type > state
                            name > n
                            value > 800
                        }
                    }
                }
            }
            button label="My contacts", width="250", height="200", x="212", y="500", textsize="40", icon="iconRight2.png", iconx="65", icony="20", adjtext="35" {
                event name="clicked" {
                    action preconditions="no", name="transition" {
                        parameter {
                            type > state
                            name > n
                            value > 15007
                        }
                    }
                }
            }
            button label="Other", width="250", height="200", x="562", y="500", textsize="40", icon="iconWrong2.png", iconx="65", icony="20", adjtext="35" {
                event name="clicked" {
                    action preconditions="no", name="transition" {
                        parameter {
                            type > state
                            name > n
                            value > 15100
                        }
                    }
                }
            }
        }
    }
}

但我会这样写(这也是正确的 YML):

// this grammar could be in a header file named guidsl.yml2

decl state(no);
decl as3function @name;
decl button(icon="none"); // default value
decl event @name;
// for the click event (which is frequent) we define a shortcut
decl clicked (*to, name="clicked") alias event {
    action transition {
        parameter n {
            type state;
            value *to;
        }
    }
};
decl action @name (preconditions="no");
decl parameter *name { name *name; content; };
decl type @name;
decl part(type="text", say=1);

// here comes the model
// include guidsl.yml2

// sensible defaults for this single case

decl button is button (
    width=250,
    height=200,
    textsize=40,
    iconx=65,
    icony=20,
    adjtext=35
);

state 15000 {
    timeout 30;
    backgroundactions
        as3function hideImages;
    screen {
        components {
            textfield x=50 y=120 width=924 textsize=50 background=1 border=1 {
                part > Who would you like to call?
            }
            button label="MENU" width=80 height=30 x=920 y=10 textsize=14 adjtext=-5 {
                clicked 800;
            }
            button label="My contacts" x=212 y=500 icon="iconRight2.png" {
                clicked 15007;
            }
            button label="Other" x=562 y=500 icon="iconWrong2.png" {
                clicked 15100;
            }
        }
    }
}

YSLT(YML 的一部分)现在为您提供了一种语言来生成代码。

根据您的问题,有 XML Schema 语言来描述和检查,请参阅http://www.w3.org/XML/Schema – 当然,还有 YSchema ;-)

VB,pyPEG 和 YML 的作者

于 2013-02-16T14:39:07.350 回答
0

关于“语义如何工作”的问题:您可能正在寻找建模理论。它是分析哲学的一部分。

因为我也错过了这一点,所以我正在研究如何将理论哲学的知识通过信息学转移到计算机科学中。不过,还有很多工作要做。很抱歉,我还没有发表我所拥有的东西——我不是在大学工作,而是自己筹钱。所以我没有以正确的方式写出已经可用的东西:-/因此,这只能是你前进方向的提示。我从 Gottlob Frege 开始,但离开了他的想法,几年后更多地与 Saul Kripke 的观点合作。言语行为理论也令人大开眼界。

为什么不是那些简单的语义工具之一?因为除了简单的情况外,我没有找到一种在实践中有效的方法。不可能有一个元模型和一个模型,仅此而已。这只是一个开端。还有更多需要。

我现在正在使用这种范例开发一种编程语言。但是现在展示还为时过早,再次抱歉。

只需在实践中尝试一种常见的语义工具,您就会发现自己缺少什么。

VB。

于 2013-02-16T14:47:19.160 回答