{"id":16889764,"url":"https://github.com/gwenn/jlemon","last_synced_at":"2025-07-27T08:05:11.356Z","repository":{"id":57719851,"uuid":"92391778","full_name":"gwenn/jlemon","owner":"gwenn","description":"Lemon parser generator modified to build an SQL parser in Java","archived":false,"fork":false,"pushed_at":"2024-12-09T17:44:04.000Z","size":630,"stargazers_count":3,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-03T21:51:21.142Z","etag":null,"topics":["java","parser-generator","sql-parser"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gwenn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-05-25T10:19:32.000Z","updated_at":"2024-12-09T17:44:05.000Z","dependencies_parsed_at":"2023-02-01T04:00:44.512Z","dependency_job_id":"ce20f1fc-79f9-4b60-9234-b8cd5d5cb62c","html_url":"https://github.com/gwenn/jlemon","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwenn%2Fjlemon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwenn%2Fjlemon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwenn%2Fjlemon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwenn%2Fjlemon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gwenn","download_url":"https://codeload.github.com/gwenn/jlemon/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239643207,"owners_count":19673572,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","parser-generator","sql-parser"],"created_at":"2024-10-13T16:58:48.600Z","updated_at":"2025-02-19T10:36:35.812Z","avatar_url":"https://github.com/gwenn.png","language":"Java","readme":"# jlemon\n\nA fork of the\n[LEMON parser generator](https://www.sqlite.org/src/doc/trunk/doc/lemon.html)\nthat generates Java code and the associated [SQL parser](http://www.sqlite.org/src/artifact?ci=trunk\u0026filename=src/parse.y).\n\nFiles `lemon.c`, `lempar.c` are extracted from SQLite v3.18.0.\n\n![](https://github.com/gwenn/jlemon/workflows/CI/badge.svg)\n[![Maven Central](https://img.shields.io/maven-central/v/com.github.gwenn/sqlite-parser.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22com.github.gwenn%22%20AND%20a:%22sqlite-parser%22)\n[![Javadocs](https://www.javadoc.io/badge/com.github.gwenn/sqlite-parser.svg)](https://www.javadoc.io/doc/com.github.gwenn/sqlite-parser)\n\n## Usage\n\n```bash\n\u003e # compile\n\u003e cc -g -O2 -o jlemon lemon.c\n\u003e # run\n\u003e jlemon \u003cfilename\u003e.y\n\u003e # preprocess generated code\n\u003e cpp -P \u003cfilename\u003e.j \u003e yyParser.java\n```\n\nFor example:\n```bash\ncc -g -O2 -o jlemon lemon.c\n./jlemon src/test/java/simple/parser.y\ncpp -P src/test/java/simple/parser.j \u003e src/test/java/simple/yyParser.java\nmvn test\n```\nOr on Windows platform:\n```\ncl /O2 /Fejlemon.exe lemon.c\njlemon.exe src\\test\\java\\simple\\parser.y\ncl /EP /C src\\test\\java\\simple\\parser.j \u003e src\\test\\java\\simple\\yyParser.java\n```\n\n## Generated Parser API\n\n```java\npublic class yyParser {\n  // %extra_argument declaration\n\n  public yyParser(\n    ParseARG_PDECL               /* Optional %extra_argument parameter */\n  ) {\n    // constructor\n  }\n  public void ParseFinalize() {  /* or can be renamed to %nameFinalize */\n    // optional (clean the stack)\n  }\n  public void Parse(             /* or can be renamed to %name */\n    int yymajor,                 /* The major token code number */\n    ParseTOKENTYPE yyminor       /* The value for the token */\n  ){\n    // To be called by lexer\n  }\n}\n```\n\n## Hack\n\nAs there is no `union` in Java, `yy%d` fields of `YYMINORTYPE` have been replaced by `yy%d()` getters and `yy%d(%type value)` setters.\nBut when translating code (see `translate_code`), the logic used to make the difference between a read access to a `yy%d` field and a write access is fallible.\n\nMaybe try a code manipulator ([janino](http://janino-compiler.github.io/janino/#janino-as-a-code-manipulator)) ?\nOr [javolution Union](http://javolution.org/apidocs/javolution/io/Union.html) ?\n\n## SQL Parser\n\n[SQLite lexer](http://www.sqlite.org/src/artifact?ci=trunk\u0026filename=src/tokenize.c) and [SQLite parser](http://www.sqlite.org/src/artifact?ci=trunk\u0026filename=src/parse.y) have been ported from C to Java.\nThe parser generates an AST.\n\nThe parser is/will be used to fix [DatabaseMetaData](https://github.com/gwenn/sqlite-jna/blob/master/src/main/java/org/sqlite/driver/DbMeta.java) implementation.\n\n * java.sql.DatabaseMetaData.getColumns\n * java.sql.DatabaseMetaData.getPrimaryKeys\n * java.sql.DatabaseMetaData.getBestRowIdentifier\n * java.sql.DatabaseMetaData.getCrossReference\n * java.sql.DatabaseMetaData.getImportedKeys\n * java.sql.DatabaseMetaData.getExportedKeys\n * java.sql.DatabaseMetaData.getIndexInfo\n\n## Lexer/Parser\n\n  - Keep track of position (line, column).\n  - Streamable (stop at the end of statement).\n  - Resumable (restart after the end of statement).\n\n## Test\n\nSQL lexer and parser have been tested with the following scripts:\n\n * https://github.com/bkiers/sqlite-parser/tree/master/src/test/resources\n * https://github.com/codeschool/sqlite-parser/tree/master/test/sql/official-suite which can be updated with script in https://github.com/codeschool/sqlite-parser/tree/master/test/misc\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgwenn%2Fjlemon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgwenn%2Fjlemon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgwenn%2Fjlemon/lists"}