gpt4 book ai didi

php - 用于文本解析的 DSL

转载 作者:行者123 更新时间:2023-12-05 02:23:03 25 4
gpt4 key购买 nike

我有一组特定领域的半结构化 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>

请给我任何关于从哪里开始的线索,阅读的内容,或者您​​是否已经看过类似的东西。如果有任何帮助,我将不胜感激。

最佳答案

构建 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 基本上是一个分词器,但它通常会为分词附加额外的上下文——这个分词是一个数字,那个分词是一个字符串文字,另一个分词是一个相等运算符.

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

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

A tree representation of the abstract syntactic structure of source code written in a programming language. Each node of the tree denotes a construct occurring in the source code. The syntax is "abstract" in not representing every detail appearing in the real syntax. For instance, grouping parentheses are implicit in the tree structure, and a syntactic construct like an if-condition-then expression may be denoted by means of a single node with two branches.

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

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

a representation, using graph notation, of all paths that might be traversed through a program during its execution.

每个节点都是一个具有属性的指令对象(声明、获取、读取...)。例如:

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

建筑

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

我建议你自己构建它:

关于php - 用于文本解析的 DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25276534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com