2013-02-02 3 views
1

저는 장치에서 전체 화면 대화 형 동작을 지정하고 실행하기 위해 매우 간단한 도메인 특정 언어 (DSL)를 설계했습니다. XML을 캐리어 구문으로 사용하는 이벤트 기반 액션 언어입니다. 그것의 실시 예는 여기 : Semantic interpretation of the DSL내 도메인 특정 언어 표현

그것은 프로그래머 선언적 UI 레이아웃 및 프로그램에 대응되어야하는 이벤트 및 설명 상태 천이 언어이다 :

<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은 가독성을 위해 설계되었습니다.

  • 초과 : 상태 타이머의 지속 기간 각각의 상태를
  • backgroundactions 실행 중 : 여기 노드에 대한 짧은 설명은 화면 구성 요소와 이러한 온 - 입력 상태
  • 상태 화면 실행되는 동작을 나타내는
  • 예상 이벤트 : 현재 상태에서 예상되는 이벤트입니다. 이러한 비동기 이벤트

문법 또는 메타 모델 (내가 언어 모델링 기술에 익숙하지 않은 오전)와 같은 형식적인 설명이 특정 언어를 표현하는 방법이 있나요 있습니다. 내 생각은이 DSL에 대한 언어 사양을 작성하여 팀의 다른 프로그래머가 Python 또는이 사양의 루아와 같이 원하는 다른 언어로 스크립트를 생성 할 수 있도록하는 것입니다. 아마이 XML을 코드 생성 할 수도있을 것입니다. 이것을 대표하는 가장 좋은 방법은 무엇입니까? 나는 많은 언어 도구와 DSL 도구를 사용 해왔다. 그러나이 언어에 가장 효율적인 것이 무엇인지 알 수 없다. 전문 지식을 가진 사람이 올바른 방향으로 나를 도울 수 있고 수행해야 할 단계를 시작하실 수 있습니다.

+0

[MPS] (http://www.jetbrains.com/mps/)를 참조하십시오. – dasblinkenlight

답변

2

실제 문제 도메인 (UI 및 관련 이벤트)에 접근하기 위해 DSL을 사용하는 것이 완벽하게 이해됩니다. 휴대 전화, 스포츠 컴퓨터, 자동차 인포테인먼트 시스템, 다양한 터치 스크린 장치 및 웹 응용 프로그램과 같은 특정 UI에 대해 지정된 몇 가지 메타 모델을 알고 있습니다 (공용 언어 : http://www.metacase.com/cases/dsm_examples-ui.html 참조). 생성기는 실제 코드, 프로토 타입 또는 테스트 스크립트를 생성하는 데 사용될 수 있습니다.

이러한 도메인 특정 모델링 언어를 정의하려면 개념 (예 : 단추, 전환, 상태) 및 관련 규칙 (예 : 버튼 전환 전환 트리거)과 몇 가지 표기법을 포함한 메타 모델을 먼저 지정하십시오. 그런 다음 언어를 테스트하여 XML에서와 같이 샘플 모델을 정의하고 마지막으로 일부 모델을 준비하면 예상 결과를 생성하는 생성기를 정의 할 수 있습니다. 파나소닉 (Panasonic), 폴라 (Polar), EADS (EADS)와 같은 회사는이 제품을 통해 더 나은 품질과 속도 향상에 대해보고했습니다. 저는 개인적으로 도움을 제공 한 몇 가지 사례를 다루었으며 언어 정의에 대한 기사를 http://www.devx.com/enterprise/Article/30550에 썼습니다. 희망이 도움이됩니다.

+0

감사합니다. 메타 모델에 지정된 실행 의미 (이 경우 상태 시스템, 이벤트 동작)도 있습니까? – iceman

+0

메타 모델은 일반적으로 정적 의미론을 다루지 만 (예 : 시작 상태는 하나의 전환을 가져야 함) 코드 생성기는 코드를 생성 할 경우 타겟 프로그래밍 언어에 대한 매핑을 정의합니다. 구성 데이터를 생성하는 경우 프레임 워크/플랫폼에서도 실행 의미가 정의됩니다. –

3

XML은 실험용으로 적합하지만 DSL에서는 XML이 끔찍한 것으로 나타났습니다 (DSL의 목적에 위배됩니다).

원하는 것을 설명 할 수있는 가장 단순하고 읽기 쉬운 언어를 작성한 다음 ANTLR, PEGjs, PyParsing, PyPEG 또는 Grako와 같은 도구를 사용하여 문법을 작성하고 구문 분석기를 생성하십시오.

다른 언어의 프로그램은 DSL로 작성된 프로그램과 함께 문자열을 전달하여 런타임을 호출 할 수 있습니다.

+0

Apalala에게 감사드립니다. DSL을 다시 디자인 할 계획입니다. 그러나 XML에 손으로 쓴 많은 레거시 코드가 있기 때문에 완성 된 한주기를 완성하고 싶습니다. 따라서 XML을 코드화 할 수있는 메타 모델이나 스펙을 정의하는 것은 내 우선 순위입니다. 다음 반복에서 제안하는 툴을 사용하여 포워드 모델링을 사용하여 DSL 디자인을 향상 시키길 원합니다 – iceman

+0

지금 XML로 유지해야한다면 [XML Schema] (http://en.wikipedia.org/wiki/XML_schema) 그것을위한 문법 정의 언어의 역할을합니다. 즉, XMD를 사용하면 DSL에서 XML 문서의 유효한 "양식"을 정의 할 수 있습니다. 덕분에 – Apalala

+0

. xsd에서는 상태 시스템 프레임 워크의 의미를 정의 할 수 없으며 구조에 대한 제약 만 정의 할 수 있습니다. http://www.w3.org/2011/04/SCXML/scxml.xsd, http://www.w3.org/2011/04/SCXML/scxml-module-core.xsd, http : // www.w3.org/2011/04/SCXML/scxml-module-external.xsd – iceman

0

은 BTW : 이미 pyPEG과 XML 출력을 기반으로 DSL 툴체인이 -이 YML입니다 http://fdik.org/yml

어쩌면이 사용자의 요구에 일치합니다. (도 올바른 YML 인)

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 
         } 
        } 
       } 
      } 
     } 
    } 
} 

하지만이처럼 작성합니다 : yml2proc 자동으로 Convering -Y 그 것이다

// 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의 일부) 지금 당신에게 언어를 제공합니다 그것을 밖으로 코드를 생성합니다. 물론, YSchema ;-)

VB, pyPEG의 저자와 YML

0

거기에있다, 그리고 -

는 질문에 따르면, 설명하고 확인 http://www.w3.org/XML/Schema를 확인하기 위해 XML 스키마 언어를이 "의미가 어떻게 작동하는지"에 대한 질문 : 아마도 당신은 모델링 이론을 찾고있을 것입니다. 그것은 분석 철학의 일부입니다.

나는 또한 그것을 놓치고 있기 때문에, 나는 정보 과학을 통해 이론 철학의 노하우를 컴퓨터 과학으로 옮기는 방법에 대한 연구를하고있다. 그래도해야 할 일이 많이 있습니다. 나는 내가 가지고있는 것을 아직 출판하지 않아서 미안합니다. 저는 대학에서 일하고 있지는 않지만 자신에게 자금을 지원합니다. 그래서 나는 쓸모없는 것을 적절한 방법으로 작성하지 않았습니다 : -/때문에 이것은 어떤 방향으로 가야할지에 대한 힌트 일뿐입니다. 나는 Gottlob Frege로 시작했지만 몇 년이 지난 지금 Saul Kripke의 관점에서 일하면서 그의 아이디어에서 멀어졌습니다. 연설 법 이론도 눈을 뜨게합니다.

일반 의미 도구 중 하나가 아닌 이유는 무엇입니까? 왜냐하면 나는 간단한 사례 옆에서 실제로 작동하는 것을 찾지 못했기 때문이다. 하나의 메타 모델과 하나의 모델을 갖는 것은 불가능합니다. 그것은 단지 초보자입니다. 더 필요한 것이 있습니다.

저는이 패러다임을 사용하여 프로그래밍 언어를 개발 중입니다. 그러나 보여주기에는 너무 이르다. 미안하다.

실제로 일반적인 시맨틱 도구 중 하나를 시험해 보면 실종 된 것을 직접 확인할 수 있습니다.

VB.