antlr/antlr4-php-runtime

ANTLR 4 的 PHP 8.0+ 运行时

0.9.1 2023-09-04 20:27 UTC

This package is auto-updated.

Last update: 2024-09-03 18:21:44 UTC


README

Build Latest Stable Version License

第一步

1. 安装 ANTLR4

入门指南 应该能帮助你开始。

2. 安装 PHP ANTLR 运行时

ANTLR 的每个目标语言都有一个运行时包,用于运行 ANTLR4 生成的解析器。运行时提供了一套通用的工具来使用您的解析器。

使用 Composer 安装运行时

composer require antlr/antlr4-php-runtime

3. 生成您的解析器

您使用 ANTLR4 的 "工具" 生成解析器。这些将引用上面安装的 ANTLR 运行时。

假设您正在使用 UNIX 系统,并已如 入门指南 中所述设置 ANTLR4 工具别名。要生成您的 PHP 解析器,请运行以下命令

antlr4 -Dlanguage=PHP MyGrammar.g4

有关 antlr4 工具的完整选项列表,请访问 工具文档页面

完整示例

假设您正在使用来自 https://github.com/antlr/grammars-v4/tree/master/json 的 JSON 语法。

然后,运行 antlr4 -Dlanguage=PHP JSON.g4。这将生成一个包含 .php 文件的集合,位于 parser 目录中,包括

JsonParser.php
JsonBaseListener.php
JsonLexer.php
JsonListener.php

ANTLR 工具的另一个常见选项是 -visitor,它将生成一个解析树访问者,但在这里我们将不这样做。有关 antlr4 工具的完整选项列表,请访问 工具文档页面

我们将编写一个小型主函数来调用生成的解析器和词法分析器(假设它们是分开的)。这个函数将输出遇到的 ParseTreeContext

<?php

namespace JsonParser;

use Antlr\Antlr4\Runtime\CommonTokenStream;
use Antlr\Antlr4\Runtime\Error\Listeners\DiagnosticErrorListener;
use Antlr\Antlr4\Runtime\InputStream;
use Antlr\Antlr4\Runtime\ParserRuleContext;
use Antlr\Antlr4\Runtime\Tree\ErrorNode;
use Antlr\Antlr4\Runtime\Tree\ParseTreeListener;
use Antlr\Antlr4\Runtime\Tree\ParseTreeWalker;
use Antlr\Antlr4\Runtime\Tree\TerminalNode;

final class TreeShapeListener implements ParseTreeListener {
    public function visitTerminal(TerminalNode $node) : void {}
    public function visitErrorNode(ErrorNode $node) : void {}
    public function exitEveryRule(ParserRuleContext $ctx) : void {}

    public function enterEveryRule(ParserRuleContext $ctx) : void {
        echo $ctx->getText();
    }
}

$input = InputStream::fromPath($argv[1]);
$lexer = new JSONLexer($input);
$tokens = new CommonTokenStream($lexer);
$parser = new JSONParser($tokens);
$parser->addErrorListener(new DiagnosticErrorListener());
$parser->setBuildParseTree(true);
$tree = $parser->json();

ParseTreeWalker::default()->walk(new TreeShapeListener(), $tree);

创建一个 example.json 文件

{"a":1}

解析输入文件

php json.php example.json

预期的输出是

{"a":1}
{"a":1}
"a":1
1

有用信息

《ANTLR 4 完全参考》

程序员经常遇到解析问题。无论是 JSON 这样的数据格式、SMTP 这样的网络协议、Apache 的服务器配置文件、PostScript/PDF 文件,还是简单的电子表格宏语言——ANTLR v4 和这本书将使解析过程变得不再神秘。ANTLR v4 已经从头开始重写,使其构建解析器和构建在解析器之上的语言应用变得更加容易。畅销书《ANTLR 完全参考》的新版完全重写,展示了如何利用这些新功能。

您可以在亚马逊购买这本书 《ANTLR 4 完全参考》,或在出版社网站上获取 电子版

您会发现这本书的 源代码 很有用。

附加语法

此存储库 是一个语法集合,其中没有动作,根目录的名称是语法解析的语言的全小写名称。