Skip to content

脚本支持多语言(python、sql)模式开发 #10

Description

@bebee4java

ides自定义了一整套dsl,如(load/save/set/connect...)等语法,具体参考。
我们希望从语法层原生支持sql、python等语言的执行,这样可以丰富脚本开发,因为很有可能某些同学习惯使用sql或python进行数据处理(算法同学同样需要python加持)。

Activity

  1. bebee4java commented on Feb 1, 2021

    @bebee4java
    OwnerAuthor

    上面的需求需要在一门脚本语言上支持多种语言开发。我们可以参考Zeppelin的做法,使用不同的Interpreter,大概是这样:

    %python
    a=1
    print(1)
    %

    对于支持jdbc协议(mysql/kylin)的sql像这样:

    %sql(test)
    select 1 from test;
    % > output

    值得关注
    我们和Zeppelin有少许差异:

    1. 末尾需要用%标识代码结束
    2. 如果执行器需要特殊输入可以通过()引用。如python需要对a表做处理:%python(a);sql需要使用test连接:%sql(test)。这和Zeppelin的Kylin解释器类似。
    3. 如果代码执行完需要输出可以用> output指定
  2. added
    enhancementNew feature or request
    and removed
    enhancementNew feature or request
    on Feb 1, 2021
  3. bebee4java commented on Feb 1, 2021

    @bebee4java
    OwnerAuthor

    我们通过antlr lexical modes找到解决方法,antler的词法分析模式允许在同份文件中包含多重语言。通过一些特殊的"哨兵"字符序列,执行不同模式的切换,参考文档。
    官方提供了xml语言实现lexical modes的例子,参考代码。

    我们的实现差不多像这样:
    定义IdesLexer.g4文件:

    lexer grammar IdesLexer;
    ...
    
    PY_MODE : '%python' -> pushMode(PYTHON_LAN);
    SQL_MODE : '%sql' -> pushMode(SQL_LAN);
    
    ...
    
    mode PYTHON_LAN;
    
    EXIT_PY : '%' -> popMode;
    IGNORE_PY : . -> more ;
    ...
    
    mode SQL_LAN;
    
    EXIT_SQL : '%' -> popMode;
    IGNORE_SQL : . -> more ;
    ...
  4. pinned this issue on Feb 9, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions