语法解析工具GraalWasm、goldmark、Syntastic、fastcxml介绍

以下为你介绍的语法解析工具都可用在Linux系统上:GraalWasm(基于 GraalVM 的 WebAssembly 引擎)、goldmark(用 Go 语言编写的 markdown 解析器)、Syntastic(Vim 的语法检查插件)、fastcxml(XML 解析库)。

1、GraalWasm(基于 GraalVM 的 WebAssembly 引擎)

GraalWasm 是在 GraalVM 中实现的 WebAssembly 引擎,它可以以二进制格式解释和编译 WebAssembly 程序,或者嵌入到其它程序中。

语法解析工具GraalWasm、goldmark、Syntastic、fastcxml介绍

语法解析工具GraalWasm、goldmark、Syntastic、fastcxml介绍

储存库结构:

GraalVM主要源存储库包括以下组件:

GraalVM SDK包含长期支持的GraalVM API。

用Java编写的GraalVM编译器支持动态和静态编译,并且可以与Java HotSpot VM集成或独立运行。

松露语言实现框架,用于为GraalVM创建语言和工具。

工具包含一组通过工具框架实现的用于GraalVM语言的工具。

底材VM框架允许在封闭环境下将Java应用程序提前(AOT)编译为可执行映像或共享对象。

Sulong是用于在GraalVM上运行LLVM位代码的引擎。

TRegex是正则表达式的实现,该正则表达式利用GraalVM高效地编译自动机。

VM包含用于构建模块化GraalVM映像的组件。

VS Code提供了Visual Studio Code扩展,这些扩展支持使用GraalVM开发多语言应用程序。

GraalVM允许运行以下语言,这些语言正在使用GraalVM核心在相关存储库中开发和测试,并可以使用Truffle和GraalVM编译器在其之上运行。这些是:

GraalJS-JavaScript(兼容ECMAScript 2019)和Node.js 10.16.3

FastR-R语言3.6.1

GraalPython-Python 3.7

TruffleRuby-Ruby编程语言2.6.2

SimpleLanguage-GraalVM的一种简单演示语言。

下载地址:https://gitee.com/mirrors/GraalWasm

2、goldmark(用 Go 语言编写的 markdown 解析器)

goldmark 是用 Go 语言编写的 markdown 解析器。易于扩展,符合标准(CommonMark),结构合理。

特性:

符合标准:goldmark 完全符合最新的 CommonMark 规范。

可扩展:可以轻松地在 goldmark 中完成添加 @username 提及语法等操作。可以添加 AST 节点、用于块级元素的解析器、用于内联级元素的解析器、用于段落的转换器、用于整个 AST 结构的转换器以及渲染器。

性能:goldmark 的性能与 cmark 相当。

鲁棒性:goldmark 已通过模糊测试工具 go-fuzz 进行了测试。

内置扩展:goldmark 附带常见的扩展名,例如表、删除线、任务列表和定义列表。

仅依赖标准库。

goldmark 对 Markdown 文本的处理流程如下:

语法解析工具GraalWasm、goldmark、Syntastic、fastcxml介绍

3、Syntastic(Vim 的语法检查插件)

语法解析工具GraalWasm、goldmark、Syntastic、fastcxml介绍

Syntastic 是一个 Vim 的语法检查插件,它通过外部语法检查器运行文件,并向用户显示所有由此产生的错误,可以按需完成,也可以在保存文件时自动完成这一过程。

目前 Syntastic 支持检测 ACPI 源语言、ActionScript、Ada、Ansible 配置、API Blueprint、AppleScript、AsciiDoc、汇编语言、BEMHTML、Bro、Bourne shell、C、C++、C#、Cabal、Chef、CMake、CoffeeScript、Coco、Coq、CSS、Cucumber、CUDA、D、Dart、DocBook、Dockerfile、Dust、Elixir、Erlang、eRuby、Fortran、Gentoo 元数据、GLSL、Go、Haml、Haskell、Haxe、Haxe、Handlebars、HSS、HTML、Java、JavaScript、JSON、JSX、Julia、LESS、Lex、Limbo、LISP、LLVM 中间语言、Lua、Markdown、MATLAB、Mercury、NASM、Nix、Objective-C、Objective-C++、OCaml、Perl、Perl 6Perl POD、PHP、gettext Portable Object、OS X 和 iOS 属性列表、Pug(以前的 Jade)、Puppet、Python、QML、R、Racket、RDF TriG、RDF Turtle、Relax NG、reStructuredText、RPM 规范、Ruby、SASS/SCSS、Scala、Slim、SML、Solidity、Sphinx、SQL、Stylus、Tcl、TeX、Texinfo、Twig、TypeScript、Vala、Verilog、VHDL、Vim 帮助、VimL、Vue.js、xHtml、XML、XSLT、XQuery、YACC、YAML、YANG 数据模型、YARA 规则、z80、Zope 页面模板与 Zsh。

下载地址:https://gitee.com/mirrors/Syntastic

4、fastcxml(XML 解析库)

fastcxml-纯 C 语言编写的 XML 解析库

什么是fastcxml:

fastcxml 是一款支持 XML 解析的多根节点的解析引擎,支持特性如下:

    支持多根 XML,一个 XML 文档支持多个 ROOT 标记,如下包含information 和 list:

    <?xml version="1.0" encoding="UTF-8"?>

    <information>

        <name>Josin</name>

        <age>26</age>

        <address>Changsha</address>

    </information>

    <list>

    <name>Linux</name>

    <version>v5.0.1</version>

    <tool>Git</tool>

    </list>

    支持XML文档声明,声明必须位于第一行,以及众多属性,标准的XML声明如下:

    <?xml version="1.0" encoding="UTF-8" author="Josin"?>

    支持标记的属性特性,如下面的 information 标记包含的 id 和 pid 属性:

    <?xml version="1.0" encoding="UTF-8"?>

    <information id="11" pid="99">

        <name>Josin</name>

        <age>26</age>

        <address>Changsha</address>

    </information>

    支持注释,注意:注释不可以嵌套

    <?xml version="1.0" encoding="UTF-8"?>

    <information id="11" pid="99">

        <!--<name>Josin</name>-->

        <age>2<!--6--></age>

        <address>Changsha</address>

    </information>

    支持 CDATA标记 防止浏览器转义

    <?xml version="1.0" encoding="UTF-8" author="Josin"?>

    <!--This is the comments-->

    <information>

        <name><![CDATA[Josin]]></name>

        <!--<age>26</age>-->

        <address>Hunan</address>

    </information>

编译 & 运行:

fastxml 可以在支持 C99标准的编译器上编译使用,使用 cmake 编译系统,需要安装 cmake 3.13 以及以上版本:

git clone https://gitee.com/josinli/fastxml.git

cd fastxml

mkdir build

cd build

cmake .. && make

./fastxml

APIs 列表:

    从字符串解析 XML,返回 NULL 表示XML文件格式错误

CXML *new_cxml_from_string(char *str, unsigned long long);

    从CXML文件信息,解码为字符串,返回的字符串需要通过 free 函数释放

char *new_string_from_cxml(CXML *c);

    释放编码后的 CXML 信息

int   trash_cxml(CXML *v);

快捷操作宏:

// 用来定义一个 CXML_n 的结构来存储解码后的XML信息

CXML_FIELD_DEF(n)

// 中间使用 *aname 来定义一个节点名称, 前面的 * 不能省略

CXML_FIELD_DEF_END(n);

// 用来声明函数,用来在其他的文件引入声明

CXML_FIELD_FUNC_DEF(n);

// 上面的声明的实现文件

CXML_FIELD_FUNC(n)

  // 存在多个节点,信息,就定义多行

  // 第一个参数对应 XML的节点名称,大小写区分

  // 第二个参数对应上面第一步 CXML_FIELD_DEF(n) 中定义的名称,去掉前缀 *

  // 第三个参数对应第一个参数的字符个数

  // 第四个参数可选 if 或者 elif 第一行必须为 if

  CXML_FIELD_CMP(name, aname, l, e)

CXML_FIELD_FUNC_END();

怎么快速在C语言或者C++操作XML:

fastxml 自定了一系列的宏,来方便操作XML文档,可以使用宏来快速完成XML文档的解析与编码,如下简短示例,针对于下面的 XML文档,我们来看看我们的解析过程:

<?xml version="1.0" encoding="UTF-8" author="Josin" ?>

<!--Hello This is the comments-->

<info>

    <name><![CDATA[Josin]]></name>

    <address>Hunan</address>

</info>

操作流程如下:

    新建 .h 和 .c 文件,如下命名为 xml_demo.c 和 xml_demo.h, 内容如下:

        xml_demo.h 文件内容如下:

    #include <fc_xml.h>

    /**

     * @brief NOTICE

     * Simple example for using the macros

     */

    CXML_FIELD_DEF(root) /* 括号内的info可以随意填写,如下相同 */

        *info /* 这里写上需要解析的 同级XML 节点名称,上面的xml最外层的只有一个 info节点,所以只有 *info */

    CXML_FIELD_DEF_END(root);

    CXML_FIELD_FUNC_DEF(root);

        xml_demo.c 内容如下:

    CXML_FIELD_FUNC(root)

        CXML_FIELD_CMP(info,    info,    4,   if) // 第一个宏参数表示的解析的节点名称,如果在上面的宏里面定义了 CXML_FIELD_DEF里面需要解析到一个不同的变量,可以定义第二个别名参数,第三个参数表示的是第一个参数的字符长度,最后一个可以使 if 或者 elif,第一个限制为if,后续的为 elif

    CXML_FIELD_FUNC_END(root);

    在 main.c中开始解析过程:

    #include <stdio.h>

    #include <xml_demo.h>

    int main(int argc, char *argv[])

    {

        char *xml_str = "<?xml version=\"1.0\" encoding=\"UTF-8\" author=\"Josin\" ?>\n"

                        "<!--Hello This is the comments-->\n"

                        "<info>\n"

                        "    <name><![CDATA[Josin]]></name>\n"

                        "    <address>Hunan</address>\n"

                        "</info>";

        CXML *xml = new_cxml_from_string(xml_str, strlen(xml_str));  

        if ( !xml ) {

            printf("Your xml format is wrong.");

            trash_cxml(xml);

            return 0;

        }

        CXML_root *root = NEW_CXML_root_FROM_DATA(xml->data);

        printf("Root name: %s\n", root->info->key);

        TRASH_CXML_root(root);

        trash_cxml(xml);

    }

    输出如下:

    Root name: info

    因为这里的info节点是一个最外层的节点,它的值是一些子节点,所以如果需要解析他的子节点信息,需要重复上面的步骤,下面是一个整的示例,demo在demo目录中:

xml_demo.h 内容如下:

#include <fc_xml.h>

/**

 * @brief NOTICE

 * Simple example for using the macros

 */

CXML_FIELD_DEF(root)

    *info

CXML_FIELD_DEF_END(root);

CXML_FIELD_FUNC_DEF(root);

CXML_FIELD_DEF(info)

    *name, *age, *addr

CXML_FIELD_DEF_END(info);

CXML_FIELD_FUNC_DEF(info);

xml_demo.c 内容如下:

#include <xml_demo.h>

/**

 * @brief NOTICE

 * Simple example for parsing the XML data

 */

CXML_FIELD_FUNC(root)

    CXML_FIELD_CMP(info,   info,    4, elif)

CXML_FIELD_FUNC_END();

CXML_FIELD_FUNC(info)

    CXML_FIELD_CMP(name,    name,    4,   if)

    CXML_FIELD_CMP(address, addr,    7, elif)

CXML_FIELD_FUNC_END();

main.c 内容如下:

#include <stdio.h>

#include <xml_demo.h>

int main(int argc, char *argv[])

{

    char *xml_str = "<?xml version=\"1.0\" encoding=\"UTF-8\" author=\"Josin\" ?>\n"

                    "<!--Hello This is the comments-->\n"

                    "<info>\n"

                    "    <name><![CDATA[Josin]]></name>\n"

                    "    <address>Hunan</address>\n"

                    "</info>";

    CXML *xml = new_cxml_from_string(xml_str, strlen(xml_str)); 

    if ( !xml ) {

        printf("Your xml format is wrong.");

        trash_cxml(xml);

        return 0;

    }

    CXML_root *root = NEW_CXML_root_FROM_DATA(xml->data);

    printf("Root name: %s\n", root->info->key);

    CXML_info *info = NEW_CXML_info_FROM_DATA(root->info->val);

    printf("%s: %s\n", info->name->key, (char *)info->name->val);

    printf("%s: %s\n", info->addr->key, (char *)info->addr->val);

    TRASH_CXML_info(info);

    TRASH_CXML_root(root);

    trash_cxml(xml);  

    return 0;

}

下载地址:https://gitee.com/josinli/fastxml

注明

以上就是语法解析工具GraalWasm、goldmark、Syntastic、fastcxml的介绍内容,这些语法解析工具都能使用在Linux操作系统中。

栏目相关文章