The getting started guide should get you started.
Each target language for ANTLR has a runtime package for running parser generated by ANTLR4. The runtime provides a common set of tools for using your parser.
Install the runtime with Composer:
composer require antlr/antlr4-php-runtime
You use the ANTLR4 “tool” to generate a parser. These will reference the ANTLR runtime, installed above.
Suppose you're using a UNIX system and have set up an alias for the ANTLR4 tool as described in the getting started guide. To generate your PHP parser, run the following command:
antlr4 -Dlanguage=PHP MyGrammar.g4
For a full list of antlr4 tool options, please visit the tool documentation page.
Suppose you're using the JSON grammar from https://github.com/antlr/grammars-v4/tree/master/json.
Then, invoke antlr4 -Dlanguage=PHP JSON.g4
. The result of this is a collection of .php
files in the parser
directory including:
JsonParser.php JsonBaseListener.php JsonLexer.php JsonListener.php
Another common option to the ANTLR tool is -visitor
, which generates a parse tree visitor, but we won't be doing that here. For a full list of antlr4 tool options, please visit the tool documentation page.
We'll write a small main func to call the generated parser/lexer (assuming they are separate). This one writes out the encountered ParseTreeContext
's:
<?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()); $tree = $parser->json(); ParseTreeWalker::default()->walk(new TreeShapeListener(), $tree);
Create a example.json
file:
{"a":1}
Parse the input file:
php json.php example.json
The expected output is:
{"a":1} {"a":1} "a":1 1