代码之家  ›  专栏  ›  技术社区  ›  b.roth

在Java中为特定于领域的语言编写解析器

  •  11
  • b.roth  · 技术社区  · 16 年前

    • 从网络共享文件夹或subversion存储库获取输入XML文件
    • 使用接口导入XML文件
    • 检查导入结果消息是否成功
    • 导出与刚刚使用接口导入的对象对应的XML,并检查其是否正确。

    newObject = GET FILE "http://svn/repos/template1.xml"
    reponseMessage = IMPORT newObject
    newObjectID = GET PROPERTY '/object/id/' FROM responseMessage
    (..)
    

    但是我不知道如何在Java中为这种语言实现一个简单的解析器。回到学校,10年前,我用 Lex Yacc

    或者,我可以放弃使用声明性语言的想法,转而选择基于XML的语言,这可能更容易为其创建解析器?你推荐什么方法?

    7 回复  |  直到 16 年前
        1
  •  6
  •   Péter Török    16 年前

    JavaCC Antlr 用于为特定于域的语言创建解析器。如果文件的编辑器不是程序员,我更喜欢这种方法而不是XML。

        2
  •  5
  •   Michael Borgwardt    16 年前
        3
  •  4
  •   Bozho    16 年前

    ANTLR 应该够了

        4
  •  2
  •   Roman    16 年前

    EBNF grammatic描述您的语言,然后使用Antlr从grammatic生成java类。

        5
  •  2
  •   Glorfindel Doug L.    7 年前

    请看Cucumber如何定义其测试用例:

    alt text
    cukes.info )

    http://cukes.info/ -可以在JRuby中运行。

        6
  •  1
  •   Bart Kiers    16 年前

    选择基于XML的语言, 为创建解析器?什么方法 你能推荐吗?

    1. 这可以很容易地用XML来描述测试场景。

      <

    2. 因为您的语法示例非常简单,所以也可以简单地使用StringTokenizer来标记和解析此类脚本。

    如果想引入更复杂的表达式或控制结构,最好选择ANTLR

        7
  •  0
  •   Graham    13 年前

    Get an input XML file from network shared folder or subversion repository
    Import the XML file using the interface
    Check if the import result message was successfull
    Export the XML corresponding to the object that was just imported
       using the interface and check if it correct.
    

    答案是肯定的,这是可以做到的,而且已经为类似的需要做到了。许多年前,我构建了一个Java DSL框架,通过简单的定制,可以将以下语法用于可编译、可运行的代码:

    file InputFile
    message Message
    
    get InputFile from http://<....>
    import Message from InputFile
    if validate Message export Message
    else
    begin
       ! Signal an error
    end
    

    file message , get , import validate 和 export 都是自定义关键字,每个关键字都需要两个不到一页代码的简单类来实现它们的编译器和运行时函数。当每一项功能完成时,它都会被放入框架中,在那里它可以立即完成它的工作。

    请注意,这只是一种可能的形式;具体的语法可以由实现者自由选择。该系统实际上是一种DIY高级汇编语言,使用预先编写的Java类来执行所有功能块,无论是用于编译还是用于运行时。该框架定义了这些功能的位置,并提供了实现所需的抽象类和接口。

    该系统满足了用户的主要需求 ,非程序员可以很容易地看到正在发生的事情。由于编译几乎是即时的,所以可以快速地进行更改并立即运行。