【问题标题】:DSL for Text Parsing用于文本解析的 DSL
【发布时间】:2014-10-06 05:52:11
【问题描述】:

我有一组特定领域的半结构化 TEXT 文档(会计报告),它们的内容都非常相似。但是,数据在每个文档模板上的处理方式不同。

编写一些正则表达式并获得我想要的数据相当容易。但是对于每个新的文档布局都必须这样做。

我想构建一个通用解析器,它接收一个脚本,说明它应该如何读取特定布局的会计报告,因此对于每个新布局,我需要做的就是编写一个比编写一个更简单的新脚本很多正则表达式。

类似的东西:

解析脚本:

declare collection_name {
  date,
  description,
  amount
}

get customer_name from line 3
get account_id from "AccountID <number>"

read data as <collection_name> from <pattern> until <pattern>

请给我任何线索,告诉我从哪里开始,读到什么,或者你是否已经看过类似的东西。非常感谢任何帮助。

【问题讨论】:

    标签: php regex parsing dsl


    【解决方案1】:

    构建一个 DSL 并不是一件容易的事,尤其是像你提议的那样具有丰富的语法,所以我假设你已经准备好了 :)

    管道是:

    Script -> Compiler -> PHP code for specific template
    

    那你就要用PHP代码来获取数据了

    TEXT -> PHP code for that template -> data(structured JSON,XML,...)
    

    因此,要构建编译器,您需要了解流程:

    Script -> Lexer(Tokenizer) -> Parser -> AST/CFG -> PHP code generation
    

    定义https://stackoverflow.com/a/380487/877594

    • Tokenizer 将文本流分解为标记,通常是通过查找空格(制表符、空格、换行符)。

    • Lexer 基本上是一个标记器,但它通常为标记附加额外的上下文——这个标记是一个数字,那个标记是一个字符串文字,这个另一个标记是一个相等运算符.

    • Parser 从词法分析器中获取标记流并将其转换为抽象语法树,表示(通常)由原始文本表示的程序。

    抽象语法树http://en.wikipedia.org/wiki/Abstract_syntax_tree

    源的抽象句法结构的树表示 用编程语言编写的代码。树的每个节点表示 源代码中出现的构造。语法是“抽象的” 不代表真实语法中出现的每个细节。为了 例如,分组括号隐含在树结构中,并且 像 if-condition-then 表达式这样的句法结构可能是 用具有两个分支的单个节点表示。

    如果您正在考虑在 DSL 中使用表达式,它们适用于表达式而不是指令。

    控制流图http://en.wikipedia.org/wiki/Control_flow_graph

    使用图形符号表示可能存在的所有路径 在执行期间遍历程序。

    每个节点都是一个带有属性的指令对象(declare, get, read,...)。例如:

    get {
        target: customer_name,
        from: line {n: 3}
    }
    

    建筑

    PHP 是一个非常糟糕的选择,因为没有像 C/C++ 中的 Flex/Bison 这样的高质量库来构建词法分析器和解析器。在这个问题中有一些工具,但我不推荐它们Flex/Bison-like functionality within PHP

    我建议你自己构建它:

    【讨论】:

    • 谢谢!你给了我很多阅读..我真的忙着做这一切。结果我发现我不需要 DSL,而是需要一个词法分析器和解析器来获取我需要的数据。
    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 2012-07-10
    • 2011-04-27
    • 2017-05-23
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多