# Fymil **Repository Path**: fyukina/fymil ## Basic Information - **Project Name**: Fymil - **Description**: Fymil是一款基于Java开发的可扩展跨平台xml标记编程语言,可以解析xml执行几乎任何API,并且可以通过Java特性扩展功能。 - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-03-19 - **Last Updated**: 2023-12-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Fymil临时文档 ## 前言 Fymil还在开发中,除了还未加入的新特性,还有部分特性未完善,如: * while命令的break实现 * 程序包的实现 * 插件的加载与装载 * 命令行参数的处理 * … 如果你对此项目感兴趣,欢迎加入我~~们~~的开发, 当然你可以参与开发Java平台之外的移植版,感谢! ## 语言特点 Fymil是以解析xml为基础的一款解释型语言,基于Java语言进行开发,具有跨平台的特性。 共有三种数据类型,分为数值类型(Number)、字符串类型(String)、布尔类型(Boolean)。数值类型是**无穷大小和无穷精度**的,变量声明的默认类型是数值型,解析的默认值是字符串类型;数值型默认值为`0`,布尔型默认值是`true`。 在此语言中,`0`和`false`解析时被认为是等同的,`0`以外的任何数值和`true`认为是等同的。在没有额外嵌套标签的情况下,不支持运算符优先级和四则运算规则。 **标签(Tag)** 是Fymil语言的基本解析单位 **程序(Program)** 是基本的执行单位 **程序包(Pack)** 是进程的基本单位 **插件(Plugin)** 是可以在每个程序包内含有的可反序列化字节码文件 **插件包(PluginPack)** 是与程序包平级并可以共享的Jar文件 依靠Fymil支持的命令更新或插件的拓展,Fymil可以与Java有同等的**API**扩展度。 除了标签以外的内容都是注释或数据的字面量,标签可能是命令、运算符、表达式等,并且自闭合标签和围堵标签在Fymil中有独自的含义。 ## 解析式语法 作为xml标记语言,数据类型往往是不可预测的,这就需要在必要时提供数据类型的提示。 根据这些提示,解释器将会通过不同的**解析模式**对数据进行处理。 Fymil支持4种解析模式。 ### 字符串解析模式 在字符串解析模式下,内容和标签将会按顺序迭代处理,并且会把所有解析的内容直接拼接。 尤其需要注意的是,字符串中**所有换行和空格都会被删去**。 应该尽量**避免在此模式下进行数值运算**,因为运算表达式的所有部分会当做字符串进行拼接。 #### 解析辅助标签 为解释器具体指明是哪种解析模式的就是解析辅助标签,大部分时候你需要加上它。 但有时候,**命令标签**会自动判断类型,所以在命令标签内容里直接写数据时往往不需要使用解析辅助标签。 在字符串解析模式下,使用``作为解析辅助标签,如: ```xml 这是一段字符串,会解析成字符串 ``` #### 解析特定标签 解析特定标签是在特定的解析模式下才会生效的标签,这些标签往往是**自闭合标签**。 ##### 换行标签(`
`) 因为字符串解析模式下所有的**换行都会被删去**,所以可以借助换行标签进行强制换行。 比如对于一段代码: ```xml 这是第一行
这是第二行
这是第三行 这还是第三行
``` ##### 空格标签(``) 介于字符串解析模式下所有的**空格都会删去**,你可以使用空格标签强制空一格。 ### 数值解析模式 在数值解析模式下,数值将支持进行数学运算,包括四则运算在内。**其中`true`会解析成`1`,`false`会解析成`0`**。 #### 解析辅助标签 数值解析模式的解析辅助标签是``,如: ```xml -98.2 ``` 其中的内容会解析成数值类型并进行返回,结果可以配合其他如参数进行使用。 #### 解析特定标签 ##### 加法标签(``) 加法标签将会把紧跟在后面的数值和前者进行相加运算,如: ```xml 7200 ``` ```xml -8203 ``` ##### 减法标签(``) 减法标签将会把紧跟在后面的数值和前者进行相减运算,如: ```xml 6263 ``` ##### 乘法标签(``) 乘法标签将会把紧跟在后面的数值和前者进行相乘运算,但这种运算通常**不遵守四则运算规则**。 如果你要控制运算先后,请**嵌套解析辅助标签**,如: ```xml 8 35 ``` 这个解析的数学算式等效于`8*(3+5)`。 ##### 除法标签(``) 除法标签将会把紧跟在后面的数值和前者进行除法运算,仍然**不支持四则运算规则**。 如果想控制运算先后,请依旧嵌套解析辅助标签。 不管有没有除尽,默认情况都会**保留到小数点后三位**。 ### 布尔解析模式 布尔解析模式下,文本和标签会被解析成`true`或者`false`。 其中文本只能是`true`或`false`的一种可能结果,如果出现其他结果,**0为`false`,其他为`true`**。 #### 解析辅助标签 布尔解析模式的解析辅助标签是``,其中所有的布尔运算都会**严格按照从左到右的顺序**,除非嵌套解析辅助标签。 #### 解析特定标签 ##### 与标签(``) 使用与标签可以把紧跟在后面的布尔值与前者进行与运算,如: ```xml falsetrue ``` 会被解析成`false`。 ##### 或标签(``) 使用或标签可以把紧跟在后面的布尔值与前者进行或运算,如: ```xml 7 false ``` 将会被解析成`true`。因为`7`会解析成`true`,`true`与任何布尔值或运算都是`true`。 需要注意的是,Fymil并**不会发生布尔计算的短路**,``内的所有都会被解析运算。 ### 比较解析模式 比较解析模式是Fymil的最后一个解析模式,也是最强大的解析模式,不同的数据类型也可以进行比较。 #### 解析辅助标签 比较解析模式的解析辅助标签是``,会和布尔解析模式一样返回一个布尔类型的数据。 #### 解析特定标签 ##### 等于标签(``) 对于**两个数值类型**的数据,可以使用此标签进行纯数据大小上的比较。 如果数据精度不一致,但大小一样,依旧会被认定为相等。 如果两个数据满足相等关系,将返回`true`,否则返回`false`,如: ```xml 8.00 8 ``` 解析成的是`true`,即使精度不一致。 对于**两个字符串类型**或者**两个布尔类型**的数据的比较,则按照一般高级语言的数据比较规则。 如果是**数据类型和布尔类型**的比较,`0`会被处理成`false`,非`0`数值处理成`true`,然后进行布尔比较,如: ```xml true3 ``` 将会被解析成`true`,因为`3`会被解析成`true`。 ##### 不等标签(``) 用于判断两个数值纯粹大小上是否不等,两个字符串数据是否不等,两个布尔值是否相反。 ##### 大于标签(``) ##### 小于标签(``) ##### 大于等于标签(``) ##### 小于等于标签(``) 判断前一个数据是否大于(小于、大于等于、小于等于)紧跟在后面的元素,根据两者的数据类型不同有不同的情况。 对于两个数值类型数据,进行常规的大小判断。 对于两个字符串类型的数据,对它们的长度进行大小判断。 其他情况下,都返回`false`。 ### 表达式解析 不同于不同解析模式下的解析特定标签,表达式标签通常在任何模式下都会解析。 表达式标签往往是围堵标签,本身就具有解析辅助标签的作用。 #### 绝对值标签`` 绝对值标签本身可以作为``标签,会对其中的数据进行数值解析,同时对解析的结果取绝对值。 如: ```xml Result:
-7
``` 解析结果: ```plaintext Result: 7 ``` ``并没有放在``下,因为它本身就具备此功能,同时`-7`取绝对值得到`7`。 结合前面所有学到的: ```xml 5.0 5.0 ``` 这里的返回值明显是`false`,因为字符串类型的`5.0`和数字类型的`5.0`是不对等的。 ### 解析推测 当进行比较等运算时(非表达式解析),可以对纯文本数据不加上任何解析辅助标签,这时候就会对内容进行推测。 对于字面上类似于数字的文本,会自动解析为数值;**`true`一律解析为`1`,`false`一律解析为`0`**;其他情况会解析成字符串。 比如对于以下: ```xml 1true ``` 会被解析成`true`,因为`1`被解析为数值`1`,`true`也被解析为数值`1`。 ## 命令与函数 ### 主程序入口 从根标签``开始,`
`指定了程序的入口位置,当一个Program文件被执行,将会从这里开始。 在main标签里,是一个代码块,里面可以按顺序写若干命令标签,它们将会被识别并按照从上到下的顺序执行,如: ```xml
HelloWorld! 0
``` 所以,程序总体结构是: ```xml
``` ### 内置命令 #### 打印命令(print) 打印命令会将数据打印在控制台上,标签围堵的内容会自动加上``标签,所以**不需要加解析辅助标签**。 比如: ```xml 计算结果:71.2 ``` 和``标签的特性一样,运算部分不要忘记加上额外的解析辅助标签,否则: ```xml 计算结果: 7 3.0 ``` 解析结果是:`计算结果:73.0`,也就是被省略的``标签内所有内容会默认按照字符串拼接。 #### 变量命令(var) Fymil具有强大的变量域特性,这允许不同级别的代码块拥有自己的变量作用域。 此处只展示简单的变量操作,变量域请见进阶部分。 以`$`开头的变量名的变量为上下文变量,是由解释器控制的,**不可操作也不可赋值**,只能获取。 变量声明将会在第一次赋值时实现。在标签属性中,用id指代变量名,如: ```xml 3 ``` 标签围堵的内容为赋值的值,这里省略了type属性和op属性。 type属性指代了要声明或赋值的变量类型,可以是: * number:数值型(省略type标签时默认是这个,默认值`0`) * boolean:布尔型(默认值`true`) * string:字符串型(默认值`""`) 如果采用**自闭和标签**,type指定时使用该类型默认值,未指定时使用数值型默认值。 op属性可以是: * set:赋值或声明(省略op标签时默认是这个) * plus:自增(只适用于数值型) #### 输入命令(input) 这个命令暂时还不完善,只是为了实现与数据输入的交互临时加入的。 目前输入的内容都会默认变为字符串,并且需要一个变量进行存储。 存储的变量用``标签承接,如: ```xml ``` 从控制台等待并读入一行数据,并存储在**必须已经声明**的变量中。 #### 终止命令(shut) 此命令可能会在将来移除,用于终止整个虚拟机的进程。直接使用自闭和标签`` #### 分支命令(if) 此命令标签内为新的代码块,新的变量域开辟,也就是一切在里面声明的变量将会失效。 但**并不支持**存在于多个变量域级别的同名变量。 代码块内的``会优先解析,这里省略了``标签。只有解析结果为`true`才会执行代码块的内容,如: ```xml
1 成立
``` ``标签里的代码块会执行,因为值为`1`的变量`x`确实大于等于`1` 如果不成立,则会解析``标签内的并执行,当然是``标签存在时 *思考:此处使用了解析推测* #### 循环命令(while) 请暂时回避使用此命令,因为还未完善。 ## 进阶部分 ### 流式解析 ### 流标签覆盖 ### 变量域 ### 资源与多媒体 更多特性书写或开发中…