{"id":16123269,"url":"https://github.com/anatawa12/kotlinpattern","last_synced_at":"2025-04-06T12:15:33.826Z","repository":{"id":103067090,"uuid":"131558379","full_name":"anatawa12/KotlinPattern","owner":"anatawa12","description":"This is a LR(1) parser generator for Kotlin.","archived":false,"fork":false,"pushed_at":"2020-01-01T05:40:51.000Z","size":100,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-12T17:51:35.897Z","etag":null,"topics":["kotlin","lr1","parser-generator","statement"],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anatawa12.png","metadata":{"files":{"readme":"README.ja.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":"2018-04-30T05:14:35.000Z","updated_at":"2020-03-26T01:16:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"a93cb3fa-a12f-4915-a3e3-3bb0d4628de3","html_url":"https://github.com/anatawa12/KotlinPattern","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anatawa12%2FKotlinPattern","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anatawa12%2FKotlinPattern/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anatawa12%2FKotlinPattern/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anatawa12%2FKotlinPattern/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anatawa12","download_url":"https://codeload.github.com/anatawa12/KotlinPattern/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247478329,"owners_count":20945267,"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":["kotlin","lr1","parser-generator","statement"],"created_at":"2024-10-09T21:15:15.091Z","updated_at":"2025-04-06T12:15:33.818Z","avatar_url":"https://github.com/anatawa12.png","language":"Kotlin","readme":"#KotlinPattern\n\n* [コレは何？](#コレは何？)\n* [使い方](#使い方)\n  * [文](文)\n  * [ファイル生成](#ファイル生成)\n* [完全な文法定義](#完全な文法定義)\n\n## コレは何？\nThis is a LR parser generator for kotlin.\nThis generator's result is kotlin file.\n\n## 使い方\n### 文\n`@package \u003cpackage\u003e`\u003cbr/\u003e\nこれは生成されファイルのパッケージを指定します。\n例えば`com.anatawa12.frontend.generated`などです。\n\n`@importFile ( \u003cfile-name\u003e )` \u003cbr/\u003e\nこれは`\u003cfile-name\u003e`から文法定義を読み込みます。\n`\u003cfile-name\u003e` は文字列です。\n例えば`\"./statements.kpt\"`や`\"./main.kpt\"`などです。\n\n`@importFile \u003cpackage\u003e` \u003cbr/\u003e\n生成されファイルに`\u003cpackage\u003e`をインポートさせます\n例えば`kotlin.reflect.KProperty`や`kotlin.reflect.*`や`kotlin.reflect.KProperty as Property`などです\n\n```\n\u003cpatten-name\u003e\n  : \u003cpattern1-token1\u003e \u003cpattern1-token2\u003e ...\n  : \u003cpattern2-token1\u003e \u003cpattern2-token2\u003e ...\n  ...\n  ;\n```\n```\n\u003cpatten-name\u003e: \u003ctype-name\u003e\n  : \u003cpattern1-token1\u003e \u003cpattern1-token2\u003e ...\n  : \u003cpattern2-token1\u003e \u003cpattern2-token2\u003e ...\n  ...\n  ;\n```\nコレはパターンを追加します。\nもし型を省略するのであればこのバターンの型は`Unit`になります。\n\n### ファイル生成\n以下のコマンドを実行してください。 \u003cbr /\u003e\n`java -jar build/libs/KotlinPattern-0.0.1.jar [options] [input] [output]`\n#### options\n##### `-o \u003cfile\u003e`, `--output \u003cfile\u003e`\n`\u003cfile\u003e` を出力に指定します。\n##### `-i \u003cfile\u003e`, `--input \u003cfile\u003e`\n`\u003cfile\u003e` を入力ファイルに指定します。\n##### `-p`, `--package-root`\n出力をディレクトリとして、入力のパッケージに合わせた位置に `Parser.kt` を出力します。\n##### `-f`, `--file-path`\n出力のいちにそのまま出力します。デフォルトの動作です。\n\n\n### ast generatorの作成\n`SyntaxAstGenerator`はこのような感じです。\n```kotlin\ninterface SyntaxAstGenerator {\n\tfun kptFile_0(`TopLebelObject*_0`: MutableList\u003cTopLevelObject\u003e): Kpt\n\tfun package_0(`\"@package\"_0`: Token, `SimpleName\u0026\"!d\"_1`: MutableList\u003cToken\u003e): Package\n\tfun TopLebelObject_0(importFile_0: TopLevelObject): TopLevelObject\n\tfun TopLebelObject_1(type_0: TopLevelObject): TopLevelObject\n\tfun TopLebelObject_2(pattern_0: TopLevelObject): TopLevelObject\n\tfun TopLebelObject_3(skip_0: TopLevelObject): TopLevelObject\n\tfun TopLebelObject_4(importPackage_0: TopLevelObject): TopLevelObject\n}\n```\nこのインターフェースを実装してください。\n\n### Syntaxの実行\n`SyntaxRunnner`のシグネチャーはコレです。\n```kotlin\nclass SyntaxRunner(_lexer: ()-\u003e Token, generator: SyntaxAstGenerator)\n```\nまず`SyntaxRunner`を生成して、`SyntaxRunner#run`を実行してください。\n`SyntaxRunner`はスレッドセーフではありません。\n\n## 完全な文法定義 \nコレは [Kotlinの文法定義](https://kotlinlang.org/docs/reference/grammar.html)を使用してます。\n```\n[start]\nkptFile\n  : TopLebelObject*\n  ;\n\npackage\n  : \"@package\" SimpleName{\".\"}\n  ;\n\nTopLebelObject\n  : importFile\n  : type\n  : pattern\n  : skip\n  : importPackage\n  ;\n\nimportFile\n  : \"@importFile\" \"(\" string \")\"\n  ;\n\nimportPackage\n  : \"@importFile\" SimpleName{\".\"}\n  : \"@importFile\" SimpleName{\".\"} \".\" \"*\"\n  : \"@importFile\" SimpleName{\".\"} \"as\" SimpleName\n  ;\n\ntokenName\n  : SimpleName \"\u003c\" SimpleName \"\u003e\"\n  ;\n\nskip\n  : \"@skip\" SimpleName{\",\"}\n  ;\n\npatType\n  : \":\" typeKt\n  ;\n\npattern\n  : SimpleName patType? SEMI \"=\" orPatterns \";\"\n  : SimpleName patType? SEMI patterns \";\"\n  ;\n\norPatterns\n  : PatternElements{\"|\"}\n  ;\n\npatterns\n  : \":\" PatternElements{\":\"}\n  ;\n\nPatternElements\n  : PatternExp*\n  ;\n\nPatternExp\n  : PatternElement\n  : PatternElement \"*\"\n  : PatternElement \"+\"\n  : PatternElement \"?\"\n  : PatternElement \"{\" PatternElement \"}\"\n  ;\n\nPatternElement\n  : string\n  : SimpleName\n  ;\n\ntypeKt\n  : typeReference\n  ;\n\ntypeReference\n  : \"(\" typeReference \")\"\n  : userType\n  : nullableType\n  ;\n\nnullableType\n  : typeReference \"?\"\n  ;\n\nuserType\n  : simpleUserType\n  : userType \".\" simpleUserType\n  ;\n\nsimpleUserType\n  : SimpleName\n  : SimpleName \"\u003c\" projectionType{\",\"} \"\u003e\"\n  ;\n\nprojectionType\n  : projection? typeKt\n  : \"*\"\n  ;\n\nprojection\n  : varianceAnnotation\n  ;\n\nvarianceAnnotation\n  : \"in\"\n  : \"out\"\n  ;\n\nSEMI\n  : LF\n  : \";\"\n  : SEMI LF\n  : SEMI \";\"\n  ;\n```","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanatawa12%2Fkotlinpattern","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanatawa12%2Fkotlinpattern","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanatawa12%2Fkotlinpattern/lists"}