Skip to content

Commit

Permalink
build: move parser and tokenizer into separate modules
Browse files Browse the repository at this point in the history
  • Loading branch information
azenla committed Oct 17, 2023
1 parent 9338b01 commit 15f5f31
Show file tree
Hide file tree
Showing 57 changed files with 92 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package gay.pizza.pork.ffi

import gay.pizza.pork.ast.gen.visit
import gay.pizza.pork.frontend.ContentSource
import gay.pizza.pork.parser.CharSource
import gay.pizza.pork.tokenizer.CharSource
import gay.pizza.pork.parser.Printer
import gay.pizza.pork.parser.StringCharSource
import gay.pizza.pork.tokenizer.StringCharSource

object JavaAutogenContentSource : ContentSource {
override fun loadAsCharSource(path: String): CharSource {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package gay.pizza.pork.frontend

import gay.pizza.pork.parser.CharSource
import gay.pizza.pork.tokenizer.CharSource

interface ContentSource {
fun loadAsCharSource(path: String): CharSource
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package gay.pizza.pork.frontend
import gay.pizza.dough.fs.FsPath
import gay.pizza.dough.fs.PlatformFsProvider
import gay.pizza.dough.fs.readString
import gay.pizza.pork.parser.CharSource
import gay.pizza.pork.parser.StringCharSource
import gay.pizza.pork.tokenizer.CharSource
import gay.pizza.pork.tokenizer.StringCharSource

class FsContentSource(val root: FsPath) : ContentSource {
override fun loadAsCharSource(path: String): CharSource =
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/main/kotlin/gay/pizza/pork/frontend/World.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import gay.pizza.pork.ast.gen.CompilationUnit
import gay.pizza.pork.ast.gen.ImportDeclaration
import gay.pizza.pork.parser.DiscardNodeAttribution
import gay.pizza.pork.parser.Parser
import gay.pizza.pork.parser.Tokenizer
import gay.pizza.pork.tokenizer.Tokenizer

class World(val importSource: ImportSource) {
private val internalUnits = mutableMapOf<String, CompilationUnit>()
Expand Down
4 changes: 2 additions & 2 deletions minimal/src/main/kotlin/gay/pizza/pork/minimal/FileTool.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import gay.pizza.dough.fs.FsPath
import gay.pizza.dough.fs.readString
import gay.pizza.pork.frontend.ContentSource
import gay.pizza.pork.frontend.FsContentSource
import gay.pizza.pork.parser.CharSource
import gay.pizza.pork.parser.StringCharSource
import gay.pizza.pork.tokenizer.CharSource
import gay.pizza.pork.tokenizer.StringCharSource

class FileTool(val path: FsPath) : Tool() {
override fun createCharSource(): CharSource =
Expand Down
1 change: 1 addition & 0 deletions minimal/src/main/kotlin/gay/pizza/pork/minimal/Tool.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import gay.pizza.pork.frontend.DynamicImportSource
import gay.pizza.pork.frontend.World
import gay.pizza.pork.parser.*
import gay.pizza.pork.stdlib.PorkStdlib
import gay.pizza.pork.tokenizer.*

abstract class Tool {
abstract fun createCharSource(): CharSource
Expand Down
1 change: 1 addition & 0 deletions parser/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ plugins {

dependencies {
api(project(":ast"))
api(project(":tokenizer"))

implementation(project(":common"))
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package gay.pizza.pork.parser

import gay.pizza.pork.ast.gen.Node
import gay.pizza.pork.ast.gen.NodeType
import gay.pizza.pork.tokenizer.Token

object DiscardNodeAttribution : NodeAttribution {
override fun push(token: Token) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package gay.pizza.pork.parser

import gay.pizza.pork.tokenizer.Token
import gay.pizza.pork.tokenizer.TokenSource
import gay.pizza.pork.tokenizer.TokenType

class LazySkippingTokenSource(val source: TokenSource, val skipping: Set<TokenType>) : ParserAwareTokenSource {
private var index = 0
override val currentIndex: Int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package gay.pizza.pork.parser

import gay.pizza.pork.ast.gen.Node
import gay.pizza.pork.ast.gen.NodeType
import gay.pizza.pork.tokenizer.Token

interface NodeAttribution {
fun push(token: Token)
Expand Down
2 changes: 2 additions & 0 deletions parser/src/main/kotlin/gay/pizza/pork/parser/Parser.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package gay.pizza.pork.parser

import gay.pizza.pork.ast.gen.*
import gay.pizza.pork.tokenizer.TokenSource
import gay.pizza.pork.tokenizer.TokenType

class Parser(source: TokenSource, attribution: NodeAttribution) :
ParserBase(source, attribution) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import gay.pizza.pork.ast.gen.Node
import gay.pizza.pork.ast.gen.NodeCoalescer
import gay.pizza.pork.ast.gen.data
import gay.pizza.pork.ast.gen.visit
import gay.pizza.pork.tokenizer.Token

data class ParserAttributes(val tokens: List<Token>) {
companion object {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package gay.pizza.pork.parser

import gay.pizza.pork.tokenizer.TokenSource

interface ParserAwareTokenSource : TokenSource
1 change: 1 addition & 0 deletions parser/src/main/kotlin/gay/pizza/pork/parser/ParserBase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package gay.pizza.pork.parser
import gay.pizza.pork.ast.gen.Node
import gay.pizza.pork.ast.gen.NodeParser
import gay.pizza.pork.ast.gen.NodeType
import gay.pizza.pork.tokenizer.*

abstract class ParserBase(source: TokenSource, val attribution: NodeAttribution) : NodeParser {
val source: TokenSource = if (source is ParserAwareTokenSource) {
Expand Down
2 changes: 2 additions & 0 deletions parser/src/main/kotlin/gay/pizza/pork/parser/ParserHelpers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package gay.pizza.pork.parser
import gay.pizza.pork.ast.gen.InfixOperator
import gay.pizza.pork.ast.gen.PrefixOperator
import gay.pizza.pork.ast.gen.SuffixOperator
import gay.pizza.pork.tokenizer.Token
import gay.pizza.pork.tokenizer.TokenType

internal object ParserHelpers {
fun convertInfixOperator(token: Token): InfixOperator = when (token.type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package gay.pizza.pork.parser
import gay.pizza.pork.ast.gen.Node
import gay.pizza.pork.ast.gen.NodeType
import gay.pizza.pork.ast.gen.data
import gay.pizza.pork.tokenizer.Token

open class ParserNodeAttribution : NodeAttribution {
private val stack = mutableListOf<MutableList<Token>>()
Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ includeBuild("buildext")

include(
":common",
":tokenizer",
":ast",
":parser",
":frontend",
Expand Down
4 changes: 2 additions & 2 deletions stdlib/src/main/kotlin/gay/pizza/pork/stdlib/PorkStdlib.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package gay.pizza.pork.stdlib

import gay.pizza.pork.frontend.ContentSource
import gay.pizza.pork.parser.CharSource
import gay.pizza.pork.parser.StringCharSource
import gay.pizza.pork.tokenizer.CharSource
import gay.pizza.pork.tokenizer.StringCharSource

object PorkStdlib : ContentSource {
private val stdlibClass = PorkStdlib::class.java
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.intellij.lang.BracePair
import com.intellij.lang.PairedBraceMatcher
import com.intellij.psi.PsiFile
import com.intellij.psi.tree.IElementType
import gay.pizza.pork.parser.TokenType
import gay.pizza.pork.tokenizer.TokenType

class PorkBraceMatcher : PairedBraceMatcher {
override fun getPairs(): Array<BracePair> = arrayOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.idea
import com.intellij.psi.tree.IElementType
import com.intellij.psi.tree.TokenSet
import gay.pizza.pork.ast.gen.NodeType
import gay.pizza.pork.parser.TokenType
import gay.pizza.pork.tokenizer.TokenType

object PorkElementTypes {
private val tokenTypeToElementType = mutableMapOf<TokenType, IElementType>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package gay.pizza.pork.idea
import com.intellij.lexer.LexerBase
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.psi.tree.IElementType
import gay.pizza.pork.parser.BadCharacterError
import gay.pizza.pork.parser.StringCharSource
import gay.pizza.pork.parser.Tokenizer
import gay.pizza.pork.parser.UnterminatedTokenError
import gay.pizza.pork.tokenizer.BadCharacterError
import gay.pizza.pork.tokenizer.StringCharSource
import gay.pizza.pork.tokenizer.Tokenizer
import gay.pizza.pork.tokenizer.UnterminatedTokenError
import com.intellij.psi.TokenType as PsiTokenType

class PorkLexer : LexerBase() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import com.intellij.psi.util.elementsAtOffsetUp
import gay.pizza.pork.idea.psi.gen.ArgumentSpecElement
import gay.pizza.pork.idea.psi.gen.FunctionCallElement
import gay.pizza.pork.idea.psi.gen.FunctionDefinitionElement
import gay.pizza.pork.parser.TokenType
import gay.pizza.pork.tokenizer.TokenType

@Suppress("UnstableApiUsage")
class PorkParameterInfoHandler : ParameterInfoHandler<FunctionCallElement, FunctionDefinitionElement> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import com.intellij.psi.PsiFile
import com.intellij.psi.tree.IFileElementType
import com.intellij.psi.tree.TokenSet
import gay.pizza.pork.idea.psi.gen.PorkElementFactory
import gay.pizza.pork.parser.TokenType
import gay.pizza.pork.tokenizer.TokenType

class PorkParserDefinition : ParserDefinition {
val fileElementType = IFileElementType(PorkLanguage)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.openapi.fileTypes.SyntaxHighlighter
import com.intellij.openapi.fileTypes.SyntaxHighlighterBase
import com.intellij.psi.tree.IElementType
import gay.pizza.pork.parser.TokenFamily
import gay.pizza.pork.parser.TokenType
import gay.pizza.pork.tokenizer.TokenFamily
import gay.pizza.pork.tokenizer.TokenType

object PorkSyntaxHighlighter : SyntaxHighlighter {
override fun getHighlightingLexer(): Lexer {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package gay.pizza.pork.idea

import com.intellij.lang.PsiBuilder
import gay.pizza.pork.parser.*
import gay.pizza.pork.parser.ParserAwareTokenSource
import gay.pizza.pork.tokenizer.SourceIndex
import gay.pizza.pork.tokenizer.Token
import gay.pizza.pork.tokenizer.TokenType
import com.intellij.psi.TokenType as PsiTokenType

@Suppress("UnstableApiUsage")
Expand Down
7 changes: 7 additions & 0 deletions tokenizer/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
plugins {
id("gay.pizza.pork.module")
}

dependencies {
implementation(project(":common"))
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

open class AnsiHighlightScheme : HighlightScheme {
override fun highlight(token: Token): Highlight {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package gay.pizza.pork.tokenizer

class BadCharacterError(char: Char, sourceIndex: SourceIndex, state: TokenizerState) : TokenizeError(
"Failed to produce token for '${char}' at $sourceIndex in state $state"
)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

interface CharConsumer {
fun consume(type: TokenType, tokenizer: Tokenizer): String?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

fun interface CharMatcher {
fun valid(char: Char, index: Int): Boolean
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

interface CharSource : PeekableSource<Char> {
fun peek(index: Int): Char
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

fun CharSource.readToString(): String = buildString {
while (peek() != CharSource.EndOfFile) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

class ExpectedTokenError(got: Token, sourceIndex: SourceIndex, vararg expectedTypes: TokenType) : ParseError(
class ExpectedTokenError(got: Token, sourceIndex: SourceIndex, vararg expectedTypes: TokenType) : TokenizeError(
message(got, sourceIndex, expectedTypes)
) {
companion object {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

class Highlight(val token: Token, val text: String? = null) {
override fun toString(): String = text ?: token.text
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

interface HighlightScheme {
fun highlight(token: Token): Highlight
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

class Highlighter(val scheme: HighlightScheme) {
fun highlight(stream: TokenStream): List<Highlight> =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

@Suppress("CanBeParameter")
class MatchedCharConsumer(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

interface PeekableSource<T> {
val currentIndex: Int
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

data class SourceIndex(val index: Int, val line: Int, val column: Int, val locationReliable: Boolean = true) {
companion object {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

class SourceIndexCharSource(val delegate: CharSource) : CharSource by delegate {
private var currentLineIndex = 1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

object StringCharConsumer : CharConsumer {
override fun consume(type: TokenType, tokenizer: Tokenizer): String {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

class StringCharSource(
val input: CharSequence,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

class Token(val type: TokenType, val sourceIndex: SourceIndex, val text: String) {
override fun toString(): String =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

enum class TokenFamily : TokenTypeProperty {
OperatorFamily,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

interface TokenSource : PeekableSource<Token> {
fun peekTypeAhead(ahead: Int): TokenType
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

class TokenStream(val tokens: List<Token>) {
override fun toString(): String = tokens.toString()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

class TokenStreamSource(val stream: TokenStream) : TokenSource {
private var index = 0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

import gay.pizza.pork.parser.CharMatcher.*
import gay.pizza.pork.parser.MatchedCharConsumer.Options.AllowEofTermination
import gay.pizza.pork.parser.TokenTypeProperty.*
import gay.pizza.pork.parser.TokenFamily.*
import gay.pizza.pork.parser.TokenTypeProperty.AnyOf
import gay.pizza.pork.tokenizer.CharMatcher.*
import gay.pizza.pork.tokenizer.MatchedCharConsumer.Options.AllowEofTermination
import gay.pizza.pork.tokenizer.TokenTypeProperty.*
import gay.pizza.pork.tokenizer.TokenFamily.*
import gay.pizza.pork.tokenizer.TokenTypeProperty.AnyOf

enum class TokenType(vararg val properties: TokenTypeProperty) {
NumberLiteral(NumericLiteralFamily, CharMatch(CharMatcher.AnyOf(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gay.pizza.pork.parser
package gay.pizza.pork.tokenizer

interface TokenTypeProperty {
class SingleChar(val char: Char) : TokenTypeProperty
Expand Down
Loading

0 comments on commit 15f5f31

Please sign in to comment.