Java DSL与动态代码生成技术的应用 (上集:DSL部分)

  • Upload
    -

  • View
    451

  • Download
    0

Embed Size (px)

DESCRIPTION

Java DSL与动态代码生成技术的应用的上半部分,主题为DSL的需求与实现;主要从内部、外部DSL的示例与实现出发,探讨在java中创建DSL这一话题,并附带一些工具介绍

Citation preview

  • 1. Java DSL ( :DSL ) by 2014 05 DSL

2. DSL DSL DSL 3. DSL java, prolog, scala regex sql html 4. DSL java a*b+c( ) s 1 a b 2 b c start a*b+c v.s java if-else javaregex DSL java DSL 5. DSL DSL Fluent Interface , DSL 6. DSL api service service if-else, , ...... API service1 service2 service3 example & test 7. DSL , api java assert goto( label continue) ... whatever... src javac A S T .class A S T .class JDK1.6 8. DSL :Java Annotation Processor + Compiler Tree API AST JavaAST(hyper link) (hyper link) Demo & Code Groovy? Ruby? Python? And more... ForbiddenStructuresChecker & LoopLimitEnhancer 9. DSL & BNF calc ::= expr $ expr ::= addend (('+'|'-') addend)* addend ::= factor (('*'|'/') factor)* factor ::= '(' expr ')' | 'd+(.d+)?' Pure Java Fluent Interface 10. DSL & Fluent Interface calc ::= expr $ calc.defineGrule(expr, CC.EOF) expr ::= addend (('+'|'-') addend)* expr.define(addend, CC.ks(a.or("-"), addend)) addend ::= factor (('*'|'/') factor)* addend.define(factor, CC.ks(m.or("/"), factor)) 11. DSL & Fluent Interface factor ::= '(' expr ')' | 'd+(.d+)?' factor.define("(", expr, ")") .alt("d+(.d+)?") api Code & demo 12. DSL : DSL 13. DSL api service filter 14. DSL s ::= e $ e ::= ('#' ID)+ filter ? | dto filter ::= '[' ID ':' e (',' ID ':' e)* ']' dto :: = '{' ID :e ( ',' ID ':' e)* '}' MappingSyntaxParser.java 100 java Code & demo 15. DSL {"array":[ {"key":"test", "key2":{"key3":"test3", "key4":"test4"}, "key5":"test5"}]} $namespace:serviceName#array[key:#key, key2:{key3:#key2#key3}] {"array":[{"key":"test","key2":{"key3":"test3"}}]} 16. DSL drools5 drools Java drools, 3 5 17. DSL (RDL) ... drools drools java (30s) drools RDL drools 18. DSL RDL DSL rete 19. DSL RDL AST visitor AST visitor Drools 20. DSL 5 ( drools 3 ) 1 ( drools 5 ) ($offerEntity.offerCategory = 'jaysn' || $offerEntity.offerCategory = ' / /MP4') || $memberInfo.memberName = 'jaysn_004' || $memberInfo.memberId inBlackList 'jaysn_004' rule "19405" when mf0:OfferEntity((offerCategory == "jaysn" || offerCategory == " / /MP4")) or mf1:MemberInfo(memberName == "jaysn_004") or mf1:MemberInfo(customOpInvoker.ivk("inBlackList", memberId, "jaysn_004")) then end Code demo: BoolExprTest.java 21. DSL magical ... 2 3 ... 22. DSL ... n n + 1 build ... 23. DSL visitor Maven build ( ) N 24. build 1000 100w bug ( ) Code & demo 25. DSL 26. or 27. DSL DSL Fluent Interface : methodMissing, , AST Macro antlr javacc dropincc.java 28. dropincc.java LL(*) , antlr3 java ( ocean) https://github.com/pfmiles/dropincc.java ( PDF ) https://github.com/pfmiles/dropincc.java/wiki 29. DSL A little bit theory... + + Insight: 30. ( ) Thank You 2 2w ,