bpfsfql

package
v0.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 9, 2024 License: MIT Imports: 3 Imported by: 0

README

去中心化文件查询语言(FQL)设计方案。 这个设计方案考虑了文件的所有权、批量操作、标签管理、版本控制、条件语句、插件扩展以及异步操作等多个方面。

==========================================================

处理自定义语言(FQL)设计的词法分析器。该分析器主要用于将用户输入的字符串(一条FQL命令)转化为一组Token。下面,我将尽量概述一下这段代码的核心部分和基本流程。

关键类型和常量 TokenType 用于标记不同类型的Token,如 ACTION、'filename'、PARAM等。 有两个映射表,keywordMap 和 operatorMap,分别用于匹配关键字和操作符,将字符串映射到相应的 TokenType。 Token 结构体用于存储一个词法单元的类型和字面值。 主要函数

  1. Lex Lex 函数是该词法分析器的核心,它的任务是将输入字符串转化为一组Token。 它首先调用 encodeSpaces 函数来处理带引号的字符串中的空格,并且保存了原始字符串和修改过的字符串之间的映射关系。 然后,它使用 strings.FieldsFunc 函数来分割字符串,按空格分割,但保留带引号的部分。 最后,它遍历所有分割出来的部分,并尝试将每个部分转化为一个Token。
  2. encodeSpaces 和 decodeSpaces encodeSpaces 函数会查找所有单引号和双引号之间的字符串,并将这些字符串中的空格替换为 "SPACE"。 decodeSpaces 函数会还原 encodeSpaces 函数中替换过的空格。
  3. parseKeyValue, parseList, parseParam, parseDate, parseNumber 这些函数用于处理特定格式的字符串,并尝试将其转化为一个Token。 流程概述 输入字符串的处理: 输入字符串首先通过 encodeSpaces 函数,将字符串中的空格(如果在单引号或双引号之间)进行编码处理。

字符串分割: 处理过的字符串然后被分割成多个部分,每个部分都可能是一个Token。

Token生成: 每个部分都会尝试按照多种规则(关键字、操作符、键值对、列表等)转化为一个Token。

解码处理: 生成的Token列表最后会通过 decodeSpaces 函数,将之前编码过的空格进行还原。

注意事项 未处理的特例: 如果输入字符串中有某个部分不能被识别为任何已定义的Token,Lex 函数会返回一个错误。

列表和日期的处理: 当处理到一个以 "[" 开始的部分时,会将其视为一个列表的开始,并开始收集后续的部分直到遇到 "]",然后将收集到的部分尝试转化为一个列表Token或日期Token。

参数的处理: 如果某个部分符合 KEY=VALUE 格式,会尝试将其处理为一个参数Token。

结论 这个词法分析器的目标是将FQL语句转化为Token,可以处理多种格式和类型的Token,但对于非法的输入,它会返回错误。这是构建一个解释器或编译器的第一步,下一步通常是语法分析,将Token转化为抽象语法树。

==========================================================

文件定义语言(FDL)

  1. 创建文件 CREATE FILE 'filename' OWNED_BY='did' CUSTOM_NAME=custom_name METADATA="key1:value1,key2:value2"

    • 'filename': 要创建的文件的名称。
    • OWNER: 文件的拥有者的DID。
    • CUSTOM_NAME: 可选。为文件设定的自定义名称。
    • METADATA: 可选。为文件附加的额外信息或属性。
  2. 删除文件(需要特别注意权限) DROP FILE 'filename' AUTHORIZED BY 'did'

    • 'filename': 要删除的文件的名称。
    • AUTHORIZED BY: 执行操作的DID,必须有权限。

文件操作语言(FOL)

  1. 更新文件内容 UPDATE FILE 'filename' SET CONTENT='new content' WHERE SIZE < 5000 AND LAST_MODIFIED > '2023-01-01' AUTHORIZED BY 'did'

    • 'filename': 要更新的文件名称。
    • CONTENT: 更新后的文件内容。
    • SIZE 和 LAST_MODIFIED: 文件筛选条件。
    • AUTHORIZED BY: 执行操作的DID,必须有权限。
  2. 读取文件内容 SELECT CONTENT FROM FILE 'filename' AUTHORIZED BY 'did'

    • 'filename': 要读取的文件的名称。
    • AUTHORIZED BY: 执行操作的DID,必须有权限。
  3. 批量文件转移 BULK TRANSFER FILES [file1, file2, ...] FROM did_from TO did_to

    • FILES: 要转移的文件列表。
    • did_from 和 did_to: 资产的转移方和接收方的DID。
  4. 添加标签 ADD TAGS TO FILE 'filename' TAGS [tag1, tag2, ...] AUTHORIZED BY 'did'

    • 'filename': 要添加标签的文件的名称。
    • TAGS: 要添加的标签列表。
    • AUTHORIZED BY: 执行操作的DID,必须有权限。
  5. 列出所有文件(可加筛选条件) SHOW FILES WHERE TAGS INCLUDE [tag1, tag2, ...] AND OWNED_BY='did'

    • TAGS: 文件的标签筛选条件。
    • OWNED_BY: 文件的拥有者DID筛选条件。

文件控制语言(FCL)

  1. 资产转移 TRANSFER FILE 'filename' TO did AUTHORIZED BY 'did'

    • 'filename': 要转移的文件的名称。
    • TO: 接收资产的DID。
    • AUTHORIZED BY: 执行操作的DID,必须有权限。
  2. 共有产权设置 SET CO_OWNERS FOR FILE 'filename' CO_OWNERS=[did1, did2, ...] AUTHORIZED BY 'did'

    • 'filename': 要设置共有产权的文件的名称。
    • CO_OWNERS: 共有者的DID列表。
    • AUTHORIZED BY: 执行操作的DID,必须有权限。
  3. 资产共享 SHARE FILE 'filename' WITH 'did' AUTHORIZED BY 'did'

    • 'filename': 要共享的文件的名称。
    • WITH: 共享资产的目标DID。
    • AUTHORIZED BY: 执行操作的DID,必须有权限。

版本控制

  1. 检出特定版本 CHECKOUT FILE 'filename' VERSION version_number AUTHORIZED BY 'did'
    • 'filename': 要检出的文件的名称。
    • VERSION: 文件的特定版本号。
    • AUTHORIZED BY: 执行操作的DID,必须有权限。

插件或扩展支持

  1. 使用扩展 USE EXTENSION 'extension_name' PARAMETERS="key1:value1,key2:value2"
    • extension_name: 要使用的扩展或插件名称。
    • PARAMETERS: 扩展或插件所需的参数。

异步操作支持

  1. 异步创建文件 ASYNC CREATE FILE 'filename' OWNED_BY='did'
    • 'filename': 要异步创建的文件的名称。
    • OWNED_BY: 文件的拥有者的DID。

文件定义语言(FDL)

  1. 创建文件 CREATE FILE 'filename' OWNED_BY='did' CUSTOM_NAME=custom_name METADATA="key1:value1,key2:value2"

  2. 删除文件(需要特别注意权限) DROP FILE 'filename' AUTHORIZED BY 'did'

文件操作语言(FOL)

  1. 更新文件内容 UPDATE FILE 'filename' SET CONTENT='new content' WHERE SIZE < 5000 AND LAST_MODIFIED > '2023-01-01' AUTHORIZED BY 'did'

  2. 读取文件内容 SELECT CONTENT FROM FILE 'filename' AUTHORIZED BY 'did'

  3. 批量文件转移 BULK TRANSFER FILES [file1, file2, ...] FROM did_from TO did_to

  4. 添加标签 ADD TAGS TO FILE 'filename' TAGS [tag1, tag2, ...] AUTHORIZED BY 'did'

  5. 列出所有文件(可加筛选条件) SHOW FILES WHERE TAGS INCLUDE [tag1, tag2, ...] AND OWNED_BY='did'

文件控制语言(FCL)

  1. 资产转移 TRANSFER FILE 'filename' TO did AUTHORIZED BY 'did'

  2. 共有产权设置 SET CO_OWNERS FOR FILE 'filename' CO_OWNERS=[did1, did2, ...] AUTHORIZED BY 'did'

  3. 资产共享 SHARE FILE 'filename' WITH 'did' AUTHORIZED BY 'did'

版本控制

  1. 检出特定版本 CHECKOUT FILE 'filename' VERSION version_number AUTHORIZED BY 'did'

插件或扩展支持

  1. 使用扩展 USE EXTENSION 'extension_name' PARAMETERS="key1:value1,key2:value2"

异步操作支持

  1. 异步创建文件 ASYNC CREATE FILE 'filename' OWNED_BY='did'

  2. CREATE FILE 'filename' OWNED_BY='did' CUSTOM_NAME='custom_name' METADATA='key1:value1, key2:value2'

  3. DROP FILE 'filename' AUTHORIZED BY 'did'

  4. UPDATE FILE 'filename' SET CONTENT='new content' WHERE SIZE < 5000 AND LAST_MODIFIED > '2023-01-01' AUTHORIZED BY 'did'

  5. SELECT CONTENT FROM FILE 'filename' AUTHORIZED BY 'did'

  6. BULK TRANSFER FILES ['file1', 'file2', ...] FROM 'did_from' TO 'did_to'

  7. ADD TAGS TO FILE 'filename' TAGS ['tag1', 'tag2', ...] AUTHORIZED BY 'did'

  8. SHOW FILES WHERE TAGS INCLUDE ['tag1', 'tag2', ...] AND OWNED_BY='did'

  9. TRANSFER FILE 'filename' TO 'did' AUTHORIZED BY 'did'

  10. SET CO_OWNERS FOR FILE 'filename' CO_OWNERS=['did1', 'did2', ...] AUTHORIZED BY 'did'

  11. SHARE FILE 'filename' WITH 'did' AUTHORIZED BY 'did'

  12. CHECKOUT FILE 'filename' VERSION 'version_number' AUTHORIZED BY 'did'

  13. USE EXTENSION 'extension_name' PARAMETERS='key1:value1, key2:value2'

  14. ASYNC CREATE FILE 'filename' OWNED_BY='did'

第二版 语句

创建文件 语法:CREATE FILE 'filepath' OWNER 'did' CUSTOM_NAME 'custom_name' METADATA 'key1:value1 key2:value2'

删除文件 语法:DROP FILE 'filehash' AUTHORIZED BY 'did' DELETE 用于删除文件内的字段

更新文件内容 语法:UPDATE FILE 'filehash' SET CONTENT 'new content' WHERE SIZE < 5000 AND LAST_MODIFIED > '2023-01-01' AUTHORIZED BY 'did'

查询文件内容 语法:SELECT CONTENT FROM FILE 'filehash' AUTHORIZED BY 'did'

批量转移文件 语法:BULK TRANSFER FILES 'filehash1' 'filehash2' ... FROM 'did_from' TO 'did_to'

给文件添加标签 语法:ALTER FILE 'filehash' ADD TAGS 'tag1' 'tag2' ... AUTHORIZED BY 'did'

显示具有特定标签和所有者的文件 语法:SELECT FILES WHERE TAGS INCLUDE 'tag1' 'tag2' ... AND OWNER 'did'

转移文件 语法:TRANSFER FILE 'filehash' TO 'did' AUTHORIZED BY 'did'

设置文件的共有者 语法:ALTER FILE 'filehash' SET CO_OWNERS 'did1' 'did2' ... AUTHORIZED BY 'did'

分享文件 语法:SHARE FILE 'filehash' WITH 'did' AUTHORIZED BY 'did'

文件版本检出 语法:CHECKOUT FILE 'filehash' VERSION 'version_number' AUTHORIZED BY 'did'

使用扩展 语法:USE EXTENSION 'extension_name' PARAMETERS 'key1:value1 key2:value2'

异步创建文件 语法:ASYNC CREATE FILE 'filepath' OWNER 'did'

Documentation

Overview

AST: 语法树

FQL子包:用于实现文件查询语言(File Query Language)

Parse: 语法分析

Index

Constants

View Source
const (
	// ACTION 表示操作类型(如CREATE、DROP、UPDATE等)
	ACTION TokenType = "ACTION"
	// FILENAME 表示文件名
	FILENAME = "FILENAME"
	// ALIAS 表示别名或者自定义名称
	ALIAS = "ALIAS"
	// DID 表示分布式身份标识(Decentralized Identifier)
	DID = "DID"
	// PARAM 表示参数(如 METADATA, SIZE 等)
	PARAM = "PARAM"
	// OPTION 表示选项(用于扩展功能)
	OPTION = "OPTION"
	// OPERATOR 表示操作符(如 <, >, =, ... )
	OPERATOR = "OPERATOR"
	// NUMBER 表示数字
	NUMBER = "NUMBER"
	// ASYNC 表示异步操作
	ASYNC = "ASYNC"
	// KEYVALUE 表示键值对(如 "key1:value1" )
	KEYVALUE = "KEYVALUE"
	// LIST 表示列表格式
	LIST = "LIST"
	// DATE 表示日期格式
	DATE = "DATE"
	// CONTENT 表示文件的内容
	CONTENT = "CONTENT"
	// WHERE 表示查询条件
	WHERE = "WHERE"
	// TAGS 表示文件的标签
	TAGS = "TAGS"
	// TRANSFER 表示文件的转移操作
	TRANSFER = "TRANSFER"
	// CO_OWNERS 表示文件的共有者
	CO_OWNERS = "CO_OWNERS"
	// VERSION 表示文件的版本
	VERSION = "VERSION"
	// EXTENSION 表示扩展
	EXTENSION = "EXTENSION"
	// FILES 表示多个文件
	FILES = "FILES"
	// ATTRIBUTE 表示文件属性,如 SIZE, LAST_MODIFIED 等
	ATTRIBUTE = "ATTRIBUTE"
)

Variables

This section is empty.

Functions

func Exec

func Exec(query string) (string, error)

Exec 函数用于执行给定的 FQL 查询

Types

type ActionStatement

type ActionStatement struct {
	Token      Token                 // 操作指令的Token,例如CREATE、DROP等
	Name       string                // 操作指令的名称
	Target     Expression            // 命令的目标,如FILE、FILES、EXTENSION等
	Parameters []Expression          // 命令的参数列表,如OWNED_BY、METADATA等
	Lists      []ListExpression      // 新增: 命令的LIST列表,如[file1, file2]
	Conditions []ConditionExpression // 新增: 命令的条件列表,如SIZE < 5000
}

ActionStatement 代表FQL中的操作指令,例如CREATE、DROP等。

func (*ActionStatement) TokenLiteral

func (as *ActionStatement) TokenLiteral() string

type AliasExpression

type AliasExpression struct {
	Token Token  // 别名的Token
	Name  string // 别名,例如filename、version_number
}

AliasExpression 代表FQL中的别名。

func (*AliasExpression) TokenLiteral

func (ae *AliasExpression) TokenLiteral() string

type ConditionExpression

type ConditionExpression struct {
	Token    Token                // 条件的Token
	Left     Expression           // 条件的左侧表达式
	Operator string               // 条件的操作符,如<、>等
	Right    Expression           // 条件的右侧表达式
	Next     *ConditionExpression // 附加的条件,用于AND或OR连接的多个条件
}

ConditionExpression 代表一个条件表达式。

func (*ConditionExpression) TokenLiteral

func (ce *ConditionExpression) TokenLiteral() string

type ConditionStatement

type ConditionStatement struct {
	Token    Token // the 'WHERE' token
	Operator Token // the '<' token
	Left     Token // the 'SIZE' token
	Right    Token // the '5000' token
}

ConditionStatement 表示一个条件语句,例如SIZE < 5000

func (*ConditionStatement) TokenLiteral

func (cs *ConditionStatement) TokenLiteral() string

type Expression

type Expression interface {
	Node
	// contains filtered or unexported methods
}

Expression 代表FQL中的表达式。

type ListExpression

type ListExpression struct {
	Token    Token        // 列表的Token
	Elements []Expression // 列表中的元素
}

ListExpression 代表一个列表。

func (*ListExpression) TokenLiteral

func (le *ListExpression) TokenLiteral() string

type ListStatement

type ListStatement struct {
	Token  Token   // the '[' token
	Values []Token // the elements in the list
}

ListStatement 表示一个列表,例如[file1, file2]

func (*ListStatement) TokenLiteral

func (ls *ListStatement) TokenLiteral() string

type Node

type Node interface {
	TokenLiteral() string // 获取Token的文字内容
}

Node 是所有AST节点都必须实现的接口。

type ParameterExpression

type ParameterExpression struct {
	Token Token      // 参数的Token
	Key   string     // 参数的键,如OWNED_BY、METADATA
	Value Expression // 参数的值,可以是StringLiteral, ListExpression, ConditionExpression等
}

ParameterExpression 代表FQL中的参数。

func (*ParameterExpression) TokenLiteral

func (pe *ParameterExpression) TokenLiteral() string

type Parser

type Parser struct {
	// contains filtered or unexported fields
}

Parser 结构体

func NewParser

func NewParser(tokens []Token) *Parser

NewParser 创建一个新的Parser实例

func (*Parser) ParseStatement

func (p *Parser) ParseStatement() Statement

ParseStatement 解析一个语句

type Statement

type Statement interface {
	Node
	// contains filtered or unexported methods
}

Statement 代表FQL中的语句。例如“CREATE FILE...”或“DROP FILE...”。

type StringLiteral

type StringLiteral struct {
	Token Token  // 字符串Token
	Value string // 字符串的具体内容
}

StringLiteral 代表字符串字面值。

func (*StringLiteral) TokenLiteral

func (sl *StringLiteral) TokenLiteral() string

type TargetExpression

type TargetExpression struct {
	Token Token  // 目标的Token
	Name  string // 目标的名称,如"FILE"
}

TargetExpression 代表命令的目标,例如FILE、FILES等。

func (*TargetExpression) TokenLiteral

func (te *TargetExpression) TokenLiteral() string

type Token

type Token struct {
	Type    TokenType // 词法单元类型:如 ACTION, FILENAME 等
	Literal string    // 词法单元的字面值
}

Token 表示一个词法单元

func Lex

func Lex(input string) ([]Token, error)

Lex 是词法分析器,将输入字符串转换为Token序列

type TokenType

type TokenType string

TokenType 用于标记Token的类型

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL