<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/atcj8pla5" -->

---
title: How we ended-up creating our own parser in PHP • Tuleap Blog
description: The Tuleap team built a custom query language parser in PHP using PEG.js to enable complex tracker queries with OR operators and time windows. They chose...
canonical: https://daily.dev/posts/atcj8pla5
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: How we ended-up creating our own parser in PHP • Tuleap Blog | daily.dev
og:description: The Tuleap team built a custom query language parser in PHP using PEG.js to enable complex tracker queries with OR operators and time windows. They chose...
og:url: https://daily.dev/posts/atcj8pla5
og:image: https://api.daily.dev/og/posts/atCJ8pLA5.png
og:image:alt: Post cover image
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# How we ended-up creating our own parser in PHP • Tuleap Blog

**[PHP Dev](https://daily.dev/sources/phpdev)** · [@damienseguy](https://daily.dev/damienseguy) · 10 upvotes · 0 comments

## Summary

The Tuleap team built a custom query language parser in PHP using PEG.js to enable complex tracker queries with OR operators and time windows. They chose PEG.js as their parser generator after evaluating several PHP parsing tools, defined a grammar using parsing expression grammar (PEG) format, and integrated CodeMirror for syntax highlighting and autocomplete. The solution converts user queries into SQL statements through a syntax tree that's validated and visited, while the editor provides field suggestions and error detection to improve the user experience.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://blog.tuleap.org/how-we-ended-creating-our-own-parser-php>

## Similar posts on daily.dev

- [Don’t just attend KubeCon \+ CloudNativeCon, Merge Forward your experience\!](https://daily.dev/posts/don-t-just-attend-kubecon-cloudnativecon-merge-forward-your-experience--l0rpp73x8) · CNCF · 1 upvotes · 0 comments
- [Announcing H2 2026 KCDs](https://daily.dev/posts/announcing-h2-2026-kcds-m96goajm1) · CNCF · 1 upvotes · 0 comments
- [Two months of Open Community Groups](https://daily.dev/posts/two-months-of-open-community-groups-asf52zhbs) · CNCF · 0 upvotes · 0 comments
- [CNCF Unveils Schedule for KubeCon \+ CloudNativeCon Europe 2026](https://daily.dev/posts/cncf-unveils-schedule-for-kubecon-cloudnativecon-europe-2026-ikhcoa5cb) · CNCF · 2 upvotes · 0 comments
- [CNCF Debuts KubeCon \+ CloudNativeCon Japan 2026 Schedule](https://daily.dev/posts/cncf-debuts-kubecon-cloudnativecon-japan-2026-schedule-xp5pyudub) · CNCF · 1 upvotes · 0 comments

---

Tags: [#javascript](https://daily.dev/tags/javascript), [#php](https://daily.dev/tags/php)

[View this post on daily.dev](https://daily.dev/posts/atcj8pla5)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"DiscussionForumPosting","mainEntityOfPage":"https://daily.dev/posts/atcj8pla5","headline":"How we ended-up creating our own parser in PHP • Tuleap Blog","text":"Shared: How we ended-up creating our own parser in PHP • Tuleap Blog","url":"https://daily.dev/posts/atcj8pla5","datePublished":"2025-12-27T21:18:52.568Z","dateModified":"2025-12-27T21:19:40.919Z","author":{"@type":"Person","name":"Damien seguy","url":"https://daily.dev/damienseguy","image":"https://media.daily.dev/image/upload/s--nPbjKqol--/f_auto,q_auto/v1698422671/avatars/avatar_G85JhYcDxAg024Omc8Rlp","description":"PHP developer passionate about deep language knowledge, testing, static analysis, and sustainable it","worksFor":{"@type":"Organization","name":"Exakat","logo":"https://media.daily.dev/image/upload/s--ibtl6fze--/f_auto/v1749051132/companies/exakat"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"EndorseAction"},"userInteractionCount":35350}},"image":"https://media.daily.dev/image/upload/s--CxzD6vbw--/f_auto/v1722860399/public/Placeholder%2005","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":10},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"sharedContent":{"@type":"WebPage","url":"https://api.daily.dev/r/CbKMnoLzA"},"isPartOf":{"@type":"WebPage","url":"https://daily.dev/squads/phpdev","name":"PHP Dev"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"PHP Dev","item":"https://daily.dev/squads/phpdev"},{"@type":"ListItem","position":3,"name":"How we ended-up creating our own parser in PHP • Tuleap Blog"}]}
```

