https://github.com/anatawa12/kotlinpattern
This is a LR(1) parser generator for Kotlin.
https://github.com/anatawa12/kotlinpattern
kotlin lr1 parser-generator statement
Last synced: 11 months ago
JSON representation
This is a LR(1) parser generator for Kotlin.
- Host: GitHub
- URL: https://github.com/anatawa12/kotlinpattern
- Owner: anatawa12
- License: gpl-3.0
- Created: 2018-04-30T05:14:35.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2020-01-01T05:40:51.000Z (about 6 years ago)
- Last Synced: 2025-02-12T17:51:35.897Z (about 1 year ago)
- Topics: kotlin, lr1, parser-generator, statement
- Language: Kotlin
- Size: 97.7 KB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.ja.md
- License: LICENSE
Awesome Lists containing this project
README
#KotlinPattern
* [コレは何?](#コレは何?)
* [使い方](#使い方)
* [文](文)
* [ファイル生成](#ファイル生成)
* [完全な文法定義](#完全な文法定義)
## コレは何?
This is a LR parser generator for kotlin.
This generator's result is kotlin file.
## 使い方
### 文
`@package `
これは生成されファイルのパッケージを指定します。
例えば`com.anatawa12.frontend.generated`などです。
`@importFile ( )`
これは``から文法定義を読み込みます。
`` は文字列です。
例えば`"./statements.kpt"`や`"./main.kpt"`などです。
`@importFile `
生成されファイルに``をインポートさせます
例えば`kotlin.reflect.KProperty`や`kotlin.reflect.*`や`kotlin.reflect.KProperty as Property`などです
```
: ...
: ...
...
;
```
```
:
: ...
: ...
...
;
```
コレはパターンを追加します。
もし型を省略するのであればこのバターンの型は`Unit`になります。
### ファイル生成
以下のコマンドを実行してください。
`java -jar build/libs/KotlinPattern-0.0.1.jar [options] [input] [output]`
#### options
##### `-o `, `--output `
`` を出力に指定します。
##### `-i `, `--input `
`` を入力ファイルに指定します。
##### `-p`, `--package-root`
出力をディレクトリとして、入力のパッケージに合わせた位置に `Parser.kt` を出力します。
##### `-f`, `--file-path`
出力のいちにそのまま出力します。デフォルトの動作です。
### ast generatorの作成
`SyntaxAstGenerator`はこのような感じです。
```kotlin
interface SyntaxAstGenerator {
fun kptFile_0(`TopLebelObject*_0`: MutableList): Kpt
fun package_0(`"@package"_0`: Token, `SimpleName&"!d"_1`: MutableList): Package
fun TopLebelObject_0(importFile_0: TopLevelObject): TopLevelObject
fun TopLebelObject_1(type_0: TopLevelObject): TopLevelObject
fun TopLebelObject_2(pattern_0: TopLevelObject): TopLevelObject
fun TopLebelObject_3(skip_0: TopLevelObject): TopLevelObject
fun TopLebelObject_4(importPackage_0: TopLevelObject): TopLevelObject
}
```
このインターフェースを実装してください。
### Syntaxの実行
`SyntaxRunnner`のシグネチャーはコレです。
```kotlin
class SyntaxRunner(_lexer: ()-> Token, generator: SyntaxAstGenerator)
```
まず`SyntaxRunner`を生成して、`SyntaxRunner#run`を実行してください。
`SyntaxRunner`はスレッドセーフではありません。
## 完全な文法定義
コレは [Kotlinの文法定義](https://kotlinlang.org/docs/reference/grammar.html)を使用してます。
```
[start]
kptFile
: TopLebelObject*
;
package
: "@package" SimpleName{"."}
;
TopLebelObject
: importFile
: type
: pattern
: skip
: importPackage
;
importFile
: "@importFile" "(" string ")"
;
importPackage
: "@importFile" SimpleName{"."}
: "@importFile" SimpleName{"."} "." "*"
: "@importFile" SimpleName{"."} "as" SimpleName
;
tokenName
: SimpleName "<" SimpleName ">"
;
skip
: "@skip" SimpleName{","}
;
patType
: ":" typeKt
;
pattern
: SimpleName patType? SEMI "=" orPatterns ";"
: SimpleName patType? SEMI patterns ";"
;
orPatterns
: PatternElements{"|"}
;
patterns
: ":" PatternElements{":"}
;
PatternElements
: PatternExp*
;
PatternExp
: PatternElement
: PatternElement "*"
: PatternElement "+"
: PatternElement "?"
: PatternElement "{" PatternElement "}"
;
PatternElement
: string
: SimpleName
;
typeKt
: typeReference
;
typeReference
: "(" typeReference ")"
: userType
: nullableType
;
nullableType
: typeReference "?"
;
userType
: simpleUserType
: userType "." simpleUserType
;
simpleUserType
: SimpleName
: SimpleName "<" projectionType{","} ">"
;
projectionType
: projection? typeKt
: "*"
;
projection
: varianceAnnotation
;
varianceAnnotation
: "in"
: "out"
;
SEMI
: LF
: ";"
: SEMI LF
: SEMI ";"
;
```