<div align="center" id="top">
# XGrammar
[](https://xgrammar.mlc.ai/docs/)
[](https://github.com/mlc-ai/xgrammar/blob/main/LICENSE)
[](https://pypi.org/project/xgrammar)
**Efficient, Flexible and Portable Structured Generation**
[Get Started](#get-started) | [Documentation](https://xgrammar.mlc.ai/docs/) | [Blogpost](https://blog.mlc.ai/2024/11/22/achieving-efficient-flexible-portable-structured-generation-with-xgrammar) | [Technical Report](https://arxiv.org/abs/2411.15100)
</div>
## News
- [2025/01] XGrammar has been officially integrated into [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM).
- [2024/12] XGrammar has been officially integrated into [vLLM](https://github.com/vllm-project/vllm).
- [2024/12] We presented research talks on XGrammar at CMU Catalyst, Berkeley SkyLab, MIT HANLAB, THU IIIS, Ant Group, SGLang Meetup and Qingke AI. The slides can be found [here](https://docs.google.com/presentation/d/1iS7tu2EV4IKRWDaR0F3YD7ubrNqtGYUStSskceneelc/edit?usp=sharing).
- [2024/11] XGrammar has been officially integrated into [SGLang](https://github.com/sgl-project/sglang).
- [2024/11] XGrammar has been officially integrated into [MLC-LLM](https://github.com/mlc-ai/mlc-llm).
- [2024/11] We officially released XGrammar v0.1.0!
## Overview
XGrammar is an open-source library for efficient, flexible, and portable structured generation.
It supports general context-free grammar to enable a broad range of structures while bringing careful system optimizations to enable fast executions.
XGrammar features a minimal and portable C++ backend that can be easily integrated into multiple environments and frameworks,
and is co-designed with the LLM inference engine and enables zero-overhead structured generation in LLM inference.
## Get Started
Please visit our [documentation](https://xgrammar.mlc.ai/docs/) to get started with XGrammar.
- [Installation](https://xgrammar.mlc.ai/docs/start/install)
- [Quick start](https://xgrammar.mlc.ai/docs/start/quick_start)
Raw data
{
"_id": null,
"home_page": "https://github.com/mlc-ai/xgrammar",
"name": "xgrammar",
"maintainer": null,
"docs_url": null,
"requires_python": "<4,>=3.8",
"maintainer_email": null,
"keywords": "machine learning inference",
"author": "MLC Team",
"author_email": null,
"download_url": null,
"platform": null,
"description": "<div align=\"center\" id=\"top\">\n\n# XGrammar\n\n[](https://xgrammar.mlc.ai/docs/)\n[](https://github.com/mlc-ai/xgrammar/blob/main/LICENSE)\n[](https://pypi.org/project/xgrammar)\n\n**Efficient, Flexible and Portable Structured Generation**\n\n\n[Get Started](#get-started) | [Documentation](https://xgrammar.mlc.ai/docs/) | [Blogpost](https://blog.mlc.ai/2024/11/22/achieving-efficient-flexible-portable-structured-generation-with-xgrammar) | [Technical Report](https://arxiv.org/abs/2411.15100)\n\n</div>\n\n## News\n- [2025/01] XGrammar has been officially integrated into [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM).\n- [2024/12] XGrammar has been officially integrated into [vLLM](https://github.com/vllm-project/vllm).\n- [2024/12] We presented research talks on XGrammar at CMU Catalyst, Berkeley SkyLab, MIT HANLAB, THU IIIS, Ant Group, SGLang Meetup and Qingke AI. The slides can be found [here](https://docs.google.com/presentation/d/1iS7tu2EV4IKRWDaR0F3YD7ubrNqtGYUStSskceneelc/edit?usp=sharing).\n- [2024/11] XGrammar has been officially integrated into [SGLang](https://github.com/sgl-project/sglang).\n- [2024/11] XGrammar has been officially integrated into [MLC-LLM](https://github.com/mlc-ai/mlc-llm).\n- [2024/11] We officially released XGrammar v0.1.0!\n\n## Overview\n\n\nXGrammar is an open-source library for efficient, flexible, and portable structured generation.\nIt supports general context-free grammar to enable a broad range of structures while bringing careful system optimizations to enable fast executions.\nXGrammar features a minimal and portable C++ backend that can be easily integrated into multiple environments and frameworks,\nand is co-designed with the LLM inference engine and enables zero-overhead structured generation in LLM inference.\n\n\n\n## Get Started\n\nPlease visit our [documentation](https://xgrammar.mlc.ai/docs/) to get started with XGrammar.\n- [Installation](https://xgrammar.mlc.ai/docs/start/install)\n- [Quick start](https://xgrammar.mlc.ai/docs/start/quick_start)\n",
"bugtrack_url": null,
"license": "Apache 2.0",
"summary": "Efficient, Flexible and Portable Structured Generation",
"version": "0.1.13",
"project_urls": {
"Homepage": "https://github.com/mlc-ai/xgrammar"
},
"split_keywords": [
"machine",
"learning",
"inference"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "0f9a0d037283b55ae1877f2aa7e22ff8111d8e4527014a36e925452403198134",
"md5": "45e02571127abe754d6a25432b5433d5",
"sha256": "7c1017a39628f4242c679d746b50c087f37f0baadeca11145fc5d68260136c8c"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp310-cp310-macosx_10_15_x86_64.whl",
"has_sig": false,
"md5_digest": "45e02571127abe754d6a25432b5433d5",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4,>=3.8",
"size": 334931,
"upload_time": "2025-02-14T22:27:22",
"upload_time_iso_8601": "2025-02-14T22:27:22.980638Z",
"url": "https://files.pythonhosted.org/packages/0f/9a/0d037283b55ae1877f2aa7e22ff8111d8e4527014a36e925452403198134/xgrammar-0.1.13-cp310-cp310-macosx_10_15_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "49fb6de262ee22b43174b62dca54a6b1c614c7e3fc16e7776cedcf918b3dfb6c",
"md5": "7f751d2bf95387c94c936387b0c795cf",
"sha256": "b32c4f07baaf9a5891c3064068e4f39677da5d87fa3085d6dd935c8b72c26aa7"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp310-cp310-macosx_13_0_arm64.whl",
"has_sig": false,
"md5_digest": "7f751d2bf95387c94c936387b0c795cf",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4,>=3.8",
"size": 296596,
"upload_time": "2025-02-14T22:27:24",
"upload_time_iso_8601": "2025-02-14T22:27:24.847171Z",
"url": "https://files.pythonhosted.org/packages/49/fb/6de262ee22b43174b62dca54a6b1c614c7e3fc16e7776cedcf918b3dfb6c/xgrammar-0.1.13-cp310-cp310-macosx_13_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e9ad15115d0fd8d2c561e08ac40bfa6cf266de2c6395afe26b08ce7d03987c9a",
"md5": "2931ceab4e950168e60cb4d530628ee6",
"sha256": "d1a2613df6ac86710b5a09afbb1742ec27785f0222a13e4b7a8113f93d6201af"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "2931ceab4e950168e60cb4d530628ee6",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4,>=3.8",
"size": 401804,
"upload_time": "2025-02-14T22:21:13",
"upload_time_iso_8601": "2025-02-14T22:21:13.847932Z",
"url": "https://files.pythonhosted.org/packages/e9/ad/15115d0fd8d2c561e08ac40bfa6cf266de2c6395afe26b08ce7d03987c9a/xgrammar-0.1.13-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "dbc2716aa7fc7d1fa26e5c2c328808a99f47e75d6642403fe7a15a066852c69b",
"md5": "3c569918c6294cc861b29e0e30a347e1",
"sha256": "bc7a29bd856fadcc6779466b016822a68083976174210ea86e698febc1ffc343"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "3c569918c6294cc861b29e0e30a347e1",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4,>=3.8",
"size": 319744,
"upload_time": "2025-02-14T22:30:36",
"upload_time_iso_8601": "2025-02-14T22:30:36.814246Z",
"url": "https://files.pythonhosted.org/packages/db/c2/716aa7fc7d1fa26e5c2c328808a99f47e75d6642403fe7a15a066852c69b/xgrammar-0.1.13-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1fa7c764ac0f147bc99b9b5bb47bb947d745e4a1f163b49070ed9a66a672167a",
"md5": "1e1c2302a0bf3d1791edb8303b4b69a2",
"sha256": "6c9b605f6713a01e097a5793bb14a225644f0616615a333c57061ddb134ddc03"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp311-cp311-macosx_10_15_x86_64.whl",
"has_sig": false,
"md5_digest": "1e1c2302a0bf3d1791edb8303b4b69a2",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4,>=3.8",
"size": 336202,
"upload_time": "2025-02-14T22:27:26",
"upload_time_iso_8601": "2025-02-14T22:27:26.252914Z",
"url": "https://files.pythonhosted.org/packages/1f/a7/c764ac0f147bc99b9b5bb47bb947d745e4a1f163b49070ed9a66a672167a/xgrammar-0.1.13-cp311-cp311-macosx_10_15_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fa5ee562045f417132dbdd00290650043ad7dbd4fdd2ecf0792270eb4912d5dc",
"md5": "aa0054cc8004b32f0afce1202efd1cb7",
"sha256": "65677e7b3b44cc2e07e893d223c59586c18841dc0893d7dfb3158c10579d8119"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp311-cp311-macosx_13_0_arm64.whl",
"has_sig": false,
"md5_digest": "aa0054cc8004b32f0afce1202efd1cb7",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4,>=3.8",
"size": 297858,
"upload_time": "2025-02-14T22:27:28",
"upload_time_iso_8601": "2025-02-14T22:27:28.333613Z",
"url": "https://files.pythonhosted.org/packages/fa/5e/e562045f417132dbdd00290650043ad7dbd4fdd2ecf0792270eb4912d5dc/xgrammar-0.1.13-cp311-cp311-macosx_13_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6942af450324910c0184fa982588b6597674c97077aae8a9753dbdf7e23fe57d",
"md5": "35b89d5edec3efdcd5495dcbf115df98",
"sha256": "abbd74bf88bdb263d510d393ebbcab8244b314cd9c4efba683180ded17c8386f"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "35b89d5edec3efdcd5495dcbf115df98",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4,>=3.8",
"size": 402387,
"upload_time": "2025-02-14T22:21:16",
"upload_time_iso_8601": "2025-02-14T22:21:16.108289Z",
"url": "https://files.pythonhosted.org/packages/69/42/af450324910c0184fa982588b6597674c97077aae8a9753dbdf7e23fe57d/xgrammar-0.1.13-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "617052b4d44927f97ecf3e3e4d0c60cd1ecf201cda1b48a39a0d5b15c884cf08",
"md5": "1875c03191a68e9d29c2cc8de806f9c3",
"sha256": "5d0ed6118652e5dd974423fa4b4759c6de6e16ff2f630a7f55558c0667c0aa25"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "1875c03191a68e9d29c2cc8de806f9c3",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4,>=3.8",
"size": 320741,
"upload_time": "2025-02-14T22:30:38",
"upload_time_iso_8601": "2025-02-14T22:30:38.978283Z",
"url": "https://files.pythonhosted.org/packages/61/70/52b4d44927f97ecf3e3e4d0c60cd1ecf201cda1b48a39a0d5b15c884cf08/xgrammar-0.1.13-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b5d126fad18851833e645cdf2750ee294e52962f7848695b42dbef1c287a34ca",
"md5": "6b966946bcdce4e102c2dc630e3a932d",
"sha256": "2b8b638ae84afc0170d0c2361771f7b7f21695fbf982b52782b1a57f43927800"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp312-cp312-macosx_10_15_x86_64.whl",
"has_sig": false,
"md5_digest": "6b966946bcdce4e102c2dc630e3a932d",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4,>=3.8",
"size": 336387,
"upload_time": "2025-02-14T22:27:30",
"upload_time_iso_8601": "2025-02-14T22:27:30.390937Z",
"url": "https://files.pythonhosted.org/packages/b5/d1/26fad18851833e645cdf2750ee294e52962f7848695b42dbef1c287a34ca/xgrammar-0.1.13-cp312-cp312-macosx_10_15_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d4a2bc144ee43145be7d1caca33139732f2597bdbf3d2bb431c4ebaaa3be31b4",
"md5": "c8e80555e8a94243532c74f399065221",
"sha256": "0e3232b3540e426df68712ebdf8c7f55976a67735a505cff0a05ca915d6ba7b7"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp312-cp312-macosx_13_0_arm64.whl",
"has_sig": false,
"md5_digest": "c8e80555e8a94243532c74f399065221",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4,>=3.8",
"size": 297665,
"upload_time": "2025-02-14T22:27:32",
"upload_time_iso_8601": "2025-02-14T22:27:32.449735Z",
"url": "https://files.pythonhosted.org/packages/d4/a2/bc144ee43145be7d1caca33139732f2597bdbf3d2bb431c4ebaaa3be31b4/xgrammar-0.1.13-cp312-cp312-macosx_13_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4a2c031301b1dc87670fe58aae88ae8d9cd9a12bed895b4103d5648b3b59f055",
"md5": "93bb157237f71f63b7e3d2b0058a94f7",
"sha256": "d38885aff44cf06cdf457543fbfb1d104e2d3f4e77712f09590d20e30e7ef3e5"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "93bb157237f71f63b7e3d2b0058a94f7",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4,>=3.8",
"size": 401795,
"upload_time": "2025-02-14T22:21:18",
"upload_time_iso_8601": "2025-02-14T22:21:18.377347Z",
"url": "https://files.pythonhosted.org/packages/4a/2c/031301b1dc87670fe58aae88ae8d9cd9a12bed895b4103d5648b3b59f055/xgrammar-0.1.13-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ddc7a0dd872fc96726623390c9b7f2d1983408166c6b6bcf8778897ba41f51fd",
"md5": "03925dc9c5058aa8816998b6d6c6ef79",
"sha256": "9c569592cfda167b3c8dd45ea7a03afca926bdf050f2e70f87fbc265a9c89332"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "03925dc9c5058aa8816998b6d6c6ef79",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4,>=3.8",
"size": 321380,
"upload_time": "2025-02-14T22:30:41",
"upload_time_iso_8601": "2025-02-14T22:30:41.305415Z",
"url": "https://files.pythonhosted.org/packages/dd/c7/a0dd872fc96726623390c9b7f2d1983408166c6b6bcf8778897ba41f51fd/xgrammar-0.1.13-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f3a30c5ee2733ee38c8a27b79b9608826fc2834111bd40dbc749929e02192017",
"md5": "4d665bcd2c5c6c00d1b416c0bfe8553e",
"sha256": "f400de04c226336f7831cdd332c25b94852bb5fd3d2b63625461fdd23d13486f"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "4d665bcd2c5c6c00d1b416c0bfe8553e",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "<4,>=3.8",
"size": 402564,
"upload_time": "2025-02-14T22:21:20",
"upload_time_iso_8601": "2025-02-14T22:21:20.594031Z",
"url": "https://files.pythonhosted.org/packages/f3/a3/0c5ee2733ee38c8a27b79b9608826fc2834111bd40dbc749929e02192017/xgrammar-0.1.13-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b0d33b2ff3a9935f1ea5dce8a42bc2ddc2141ac934eae998457c55422c11d268",
"md5": "afaf6b9a599dac9e5b771477d813e15a",
"sha256": "9e050755afff2f65f2fb4880e46270faac0cba9067cdb366c8616d51198bd4ab"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp39-cp39-macosx_10_15_x86_64.whl",
"has_sig": false,
"md5_digest": "afaf6b9a599dac9e5b771477d813e15a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4,>=3.8",
"size": 335041,
"upload_time": "2025-02-14T22:27:33",
"upload_time_iso_8601": "2025-02-14T22:27:33.879077Z",
"url": "https://files.pythonhosted.org/packages/b0/d3/3b2ff3a9935f1ea5dce8a42bc2ddc2141ac934eae998457c55422c11d268/xgrammar-0.1.13-cp39-cp39-macosx_10_15_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8b21728014f4fb1b36337f4150c4df8fd5410e7e91092163b3e6a2df11dfcbc2",
"md5": "f76c7a70d5a705c4f5a786b640ef6aac",
"sha256": "8ccbdcc99b62ad6e509ab3b5c4806008b3f6e3501f1e02c5285dd768233e87fe"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp39-cp39-macosx_13_0_arm64.whl",
"has_sig": false,
"md5_digest": "f76c7a70d5a705c4f5a786b640ef6aac",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4,>=3.8",
"size": 296746,
"upload_time": "2025-02-14T22:27:35",
"upload_time_iso_8601": "2025-02-14T22:27:35.928971Z",
"url": "https://files.pythonhosted.org/packages/8b/21/728014f4fb1b36337f4150c4df8fd5410e7e91092163b3e6a2df11dfcbc2/xgrammar-0.1.13-cp39-cp39-macosx_13_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bea43b901a4c9d06208bad8dfac892b7b7d39531e46fb6881304bb958c648e51",
"md5": "8a3b1dcd8fc694850891d6f0f544ac18",
"sha256": "aec4671d522db5a79f31eed586cb1d25f8e8d650aafcde59f22fb236eeea5e1e"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "8a3b1dcd8fc694850891d6f0f544ac18",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4,>=3.8",
"size": 401981,
"upload_time": "2025-02-14T22:21:23",
"upload_time_iso_8601": "2025-02-14T22:21:23.488729Z",
"url": "https://files.pythonhosted.org/packages/be/a4/3b901a4c9d06208bad8dfac892b7b7d39531e46fb6881304bb958c648e51/xgrammar-0.1.13-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "490518e30051589deeed68558854cc281c2ad7ebab4c6698c0765c883dffd597",
"md5": "5128dbfd9a3afb46e021dc9165cb7418",
"sha256": "d571d18185246ce36b04c9156a22b36f0cf1b4587f7f91a0818c999526496459"
},
"downloads": -1,
"filename": "xgrammar-0.1.13-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "5128dbfd9a3afb46e021dc9165cb7418",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4,>=3.8",
"size": 318120,
"upload_time": "2025-02-14T22:30:43",
"upload_time_iso_8601": "2025-02-14T22:30:43.233453Z",
"url": "https://files.pythonhosted.org/packages/49/05/18e30051589deeed68558854cc281c2ad7ebab4c6698c0765c883dffd597/xgrammar-0.1.13-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-14 22:27:22",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "mlc-ai",
"github_project": "xgrammar",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "xgrammar"
}