PHP Parser
parser
PHP Parser | parser | |
---|---|---|
11 | 5 | |
16,835 | 1,557 | |
- | - | |
8.3 | 8.4 | |
12 days ago | 5 days ago | |
PHP | Yacc | |
BSD 3-clause "New" or "Revised" License | GNU General Public License v3.0 or later |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
PHP Parser
- PHP-Parser: A PHP parser written in PHP
-
Diff Speeding - Rector and sebastian/diff speed improvements through profiling
Interesting. One of the reasons I stopped considering Rector is because of how memory, CPU, and time intensive it is for a non-trivial project. Instead I've been using Nikita's PHP Parser directly and getting much better results even though it isn't multi-threaded out of the box.
-
PHP Skeleton for Bison
nikic/PHP-Parser uses a Bison equivalent for PHP parsing. See the grammar file https://github.com/nikic/PHP-Parser/blob/4.x/grammar/php7.y.
-
Alternative for nette/tokenizer?
Maybe nikic/PHP-Parser is an alternative. If you only need to tokenizer part, PHP has an extension too.
-
How PHP engine builds AST
nikic/PHP-Parser
-
Parsing with PHP, Bison and re2c
Code parsing. Many linters and code builders use php-parser. It uses YACC (analog Bison) to build AST.
-
Readonly classes RFC accepted
The PR in PHP-Parser is already on the way ↓ https://github.com/nikic/PHP-Parser/pull/834
-
[Question] Trying to understand, how does the PHP Parser work when it sees HTML?
I see there is the https://github.com/nikic/PHP-Parser
-
I was annoyed by some of PHP's syntax, so I decided to make a PHP transpiler (still in beta!)
It's good idea. But something strange. Php was made as language which embedded to HTML. And how will it work without open and close tags? Instead of parsing and replacing source code as string you might use parser e.g https://github.com/nikic/PHP-Parser
-
Tree-sitter: an incremental parsing system for programming tools
I wish there was a more universal format for parsers, but I just don't think there enough people who know their stuff.
Take PHP, a language that a lot of people use: the tree-sitter-php extension doesn't support features added in 2019, let alone features added towards the end of 2020.
If you want an up-to-date PHP parser, there's really only one open-source parser[0] that's accurate enough to be used on PHP codebases old and new, and it's written in PHP. Then if you want to parse in a robust fashion you have to adopt a number of hacks to get everything working.
I hadn't encountered LSIF before – can GitHub be configured to use those maps?
[0] https://github.com/nikic/PHP-Parser
parser
-
Inko Programming Language
I have mixed feelings on Rust's syntax, especially around generics, lifetimes, and the `modifier -> keyword` syntax (i.e. `async fn` or `pub fn`). For Inko, I wanted something that's easy to parse by hand, and no context specific parsing (e.g. `QUOTE -> something` being the start of a lifetime in one place, but a char literal in another place).
Another motivator for that is that years ago I worked on Rubinius for a while (an implementation of Ruby), and helped out with a parser for Ruby (https://github.com/whitequark/parser). The Ruby developers really liked changing their already impossible syntax in even more impossible ways on a regular basis, making it a real challenge to provide syntax related tools that support multiple Ruby versions. I wanted to avoid making the same mistake with Inko, hence I'm actively trying to keep the syntax as simple as is reasonable.
As for the specific examples:
- `fn async` means your parser only needs to look for `A | B | fn` in a certain scope, instead of `A | B | fn | async fn`. This cuts down the amount of repetition in the parser. An example is found at https://github.com/inko-lang/inko/blob/8f5ad1e56756fe00325a3..., which parses the body of a class definition.
- Skipping parentheses is directly lifted from Ruby, because I really like it. Older versions took this further by also letting you write `function arg1 arg2`, but I got rid of that to make parsing easier. It's especially nice so you can do things like `if foo.bar.baz? { ... }` instead of `if foo().bar().baz?()`, though I suspect opinions will differ on this :)
- Until recently we did in fact use `::` as a namespace separator, but I changed that to `.` to keep things consistent with the call syntax, and because it removes the need for remembering "Oh for namespaces I need to use ::, but for calls .".
- `[T]` for generics is because most editors automatically insert a closing `]` if you type `[`, but not when you type `<`. If they do, then trying to write `10<20` is annoying because you'd end up with `10<>20`. I also just like the way it looks more. The usual ambiguity issues surrounding `<>` (e.g. what leads to `foo::()` in Rust) doesn't apply to Inko, because we don't allow generics in expressions (i.e. `Array[Int].with_capacity(42)` isn't valid syntax) in the first place.
-
Marc-André Lafortune on the abstract syntax tree and rewiring Rubocop
So there was this really awesome gem called parser written by someone not on the core team that gives you a super clean understanding of the Ruby code. Not only does it not care if the parentheses are there or not, but there's a really well structured and precise mapping of where the information comes from and it is completely semantic. So if you've got parentheses or not, it's not gonna make any difference in the structure of your abstract syntax tree, but you can actually ask where are the locations. That is taken care of, but the understanding of the code, what's going on in the code is completely independent of if you wrote those parentheses or not.
-
Where is keyword behavior defined?
Working with those things, possibly with the help of reading books, tends to be how it's learned I'd say. I'm not the one you asked, but I personally worked with Ruby for 10 years, worked on a system to improve coverage reports, which relied on rewriting ruby code. Doing so was done using the Parser gem, which is a ruby parser that has a different abstract syntax tree (https://github.com/whitequark/parser). I'm also interested in programming languages development, so I try to read on this / develop my own language in my free time.
-
Bad Ruby: Hash Value Omission
Changes like this have been going on for years. I remember that back when I was still helping out with https://github.com/whitequark/parser, the author on a regular basis had to deal with Ruby making yet more non-trivial syntax changes. IIRC they eventually burned out on the project because of that, but my memory is a bit fuzzy.
-
Tree-sitter: an incremental parsing system for programming tools
This is more a function of Ruby than of tree-sitter. The tree-sitter grammars for other languages are hopefully less inscrutable. For Ruby, we basically just ported whitequark's parser [1] over to tree-sitter's grammar DSL and scanner API.
[1] https://github.com/whitequark/parser
What are some alternatives?
PHPStan - PHP Static Analysis Tool - discover bugs in your code without running it!
tree-sitter-ruby - Ruby grammar for tree-sitter
PHP Code Sniffer - PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.
tree-sitter-kotlin - Kotlin grammar for Tree-sitter
PHP CS Fixer - A tool to automatically fix PHP Coding Standards issues
lsif-os - A (mostly) language-agnostic indexer for generating LSIF data.
PHPCPD - Copy/Paste Detector (CPD) for PHP code.
Moose - MOOSE - Platform for software and data analysis.
Better Reflection - :crystal_ball: Better Reflection is a reflection API that aims to improve and provide more features than PHP's built-in reflection API.
nvim-treesitter - Nvim Treesitter configurations and abstraction layer
PHP Mess Detector - PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD. PHPMD can be seen as an user friendly frontend application for the raw metrics stream measured by PHP Depend.
csharp-mode - A major-mode for editing C# in emacs