代表我的域特定语言

时间:2013-02-02 10:49:04

标签: antlr grammar dsl dsl-tools

我设计了一种非常简单的特定于域的语言(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>

它在语义上意味着以下内容: Semantic interpretation of the DSL

这是一种状态转换语言,程序员声明性地描述了UI布局以及程序应该响应的事件以及流动事件的动作。 DSL旨在提高可读性。以下是节点的简短描述:

  • timeout:执行每个状态时状态计时器的持续时间
  • backgroundactions:这些代表在进入州时执行的操作
  • 状态屏幕:与其关联的屏幕组件和事件
  • expectedevents:当前状态所需的事件。这些是异步的 事件

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

4 个答案:

答案 0 :(得分:3)

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

创建最简单,最易读的语言,可以描述你想要的东西,然后使用ANTLR,PEGjs,PyParsing,PyPEG或Grako等工具编写语法并为其生成解析器。

其他语言的程序可以通过传递带有用DSL编写的程序的字符串来调用运行时。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

BTW:已经有一个基于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的作者

答案 3 :(得分:0)

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

因为我也忽略了这一点,我正在研究如何通过信息学将理论哲学的专业知识转化为计算机科学。但是,还有很多工作要做。对不起,我还没有发表我所拥有的内容 - 我不是在大学工作,而是为自己筹集资金。所以我没有以适当的方式写出可用的东西: - /因为这只能提示你走向哪个方向。我从Gottlob Frege开始,但离开了他的想法,多年来与Saul Kripke的观点更加合作。言语行为理论也令人大开眼界。

为什么不使用其中一种简单的语义工具?因为除了简单的案例之外我没有找到一个在实践中有效的人。它不可能有一个元模型和一个模型,就是这样。这只是一个启动者。还有更多需要。

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

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

VB。