mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-03 21:21:33 +00:00
build: move parser and tokenizer into separate modules
This commit is contained in:
@ -2,9 +2,9 @@ package gay.pizza.pork.ffi
|
|||||||
|
|
||||||
import gay.pizza.pork.ast.gen.visit
|
import gay.pizza.pork.ast.gen.visit
|
||||||
import gay.pizza.pork.frontend.ContentSource
|
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.Printer
|
||||||
import gay.pizza.pork.parser.StringCharSource
|
import gay.pizza.pork.tokenizer.StringCharSource
|
||||||
|
|
||||||
object JavaAutogenContentSource : ContentSource {
|
object JavaAutogenContentSource : ContentSource {
|
||||||
override fun loadAsCharSource(path: String): CharSource {
|
override fun loadAsCharSource(path: String): CharSource {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package gay.pizza.pork.frontend
|
package gay.pizza.pork.frontend
|
||||||
|
|
||||||
import gay.pizza.pork.parser.CharSource
|
import gay.pizza.pork.tokenizer.CharSource
|
||||||
|
|
||||||
interface ContentSource {
|
interface ContentSource {
|
||||||
fun loadAsCharSource(path: String): CharSource
|
fun loadAsCharSource(path: String): CharSource
|
||||||
|
@ -3,8 +3,8 @@ package gay.pizza.pork.frontend
|
|||||||
import gay.pizza.dough.fs.FsPath
|
import gay.pizza.dough.fs.FsPath
|
||||||
import gay.pizza.dough.fs.PlatformFsProvider
|
import gay.pizza.dough.fs.PlatformFsProvider
|
||||||
import gay.pizza.dough.fs.readString
|
import gay.pizza.dough.fs.readString
|
||||||
import gay.pizza.pork.parser.CharSource
|
import gay.pizza.pork.tokenizer.CharSource
|
||||||
import gay.pizza.pork.parser.StringCharSource
|
import gay.pizza.pork.tokenizer.StringCharSource
|
||||||
|
|
||||||
class FsContentSource(val root: FsPath) : ContentSource {
|
class FsContentSource(val root: FsPath) : ContentSource {
|
||||||
override fun loadAsCharSource(path: String): CharSource =
|
override fun loadAsCharSource(path: String): CharSource =
|
||||||
|
@ -4,7 +4,7 @@ import gay.pizza.pork.ast.gen.CompilationUnit
|
|||||||
import gay.pizza.pork.ast.gen.ImportDeclaration
|
import gay.pizza.pork.ast.gen.ImportDeclaration
|
||||||
import gay.pizza.pork.parser.DiscardNodeAttribution
|
import gay.pizza.pork.parser.DiscardNodeAttribution
|
||||||
import gay.pizza.pork.parser.Parser
|
import gay.pizza.pork.parser.Parser
|
||||||
import gay.pizza.pork.parser.Tokenizer
|
import gay.pizza.pork.tokenizer.Tokenizer
|
||||||
|
|
||||||
class World(val importSource: ImportSource) {
|
class World(val importSource: ImportSource) {
|
||||||
private val internalUnits = mutableMapOf<String, CompilationUnit>()
|
private val internalUnits = mutableMapOf<String, CompilationUnit>()
|
||||||
|
@ -4,8 +4,8 @@ import gay.pizza.dough.fs.FsPath
|
|||||||
import gay.pizza.dough.fs.readString
|
import gay.pizza.dough.fs.readString
|
||||||
import gay.pizza.pork.frontend.ContentSource
|
import gay.pizza.pork.frontend.ContentSource
|
||||||
import gay.pizza.pork.frontend.FsContentSource
|
import gay.pizza.pork.frontend.FsContentSource
|
||||||
import gay.pizza.pork.parser.CharSource
|
import gay.pizza.pork.tokenizer.CharSource
|
||||||
import gay.pizza.pork.parser.StringCharSource
|
import gay.pizza.pork.tokenizer.StringCharSource
|
||||||
|
|
||||||
class FileTool(val path: FsPath) : Tool() {
|
class FileTool(val path: FsPath) : Tool() {
|
||||||
override fun createCharSource(): CharSource =
|
override fun createCharSource(): CharSource =
|
||||||
|
@ -13,6 +13,7 @@ import gay.pizza.pork.frontend.DynamicImportSource
|
|||||||
import gay.pizza.pork.frontend.World
|
import gay.pizza.pork.frontend.World
|
||||||
import gay.pizza.pork.parser.*
|
import gay.pizza.pork.parser.*
|
||||||
import gay.pizza.pork.stdlib.PorkStdlib
|
import gay.pizza.pork.stdlib.PorkStdlib
|
||||||
|
import gay.pizza.pork.tokenizer.*
|
||||||
|
|
||||||
abstract class Tool {
|
abstract class Tool {
|
||||||
abstract fun createCharSource(): CharSource
|
abstract fun createCharSource(): CharSource
|
||||||
|
@ -4,6 +4,7 @@ plugins {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":ast"))
|
api(project(":ast"))
|
||||||
|
api(project(":tokenizer"))
|
||||||
|
|
||||||
implementation(project(":common"))
|
implementation(project(":common"))
|
||||||
}
|
}
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
package gay.pizza.pork.parser
|
|
||||||
|
|
||||||
class BadCharacterError(val char: Char, sourceIndex: SourceIndex, state: TokenizerState) : ParseError(
|
|
||||||
"Failed to produce token for '${char}' at $sourceIndex in state $state"
|
|
||||||
)
|
|
@ -2,6 +2,7 @@ package gay.pizza.pork.parser
|
|||||||
|
|
||||||
import gay.pizza.pork.ast.gen.Node
|
import gay.pizza.pork.ast.gen.Node
|
||||||
import gay.pizza.pork.ast.gen.NodeType
|
import gay.pizza.pork.ast.gen.NodeType
|
||||||
|
import gay.pizza.pork.tokenizer.Token
|
||||||
|
|
||||||
object DiscardNodeAttribution : NodeAttribution {
|
object DiscardNodeAttribution : NodeAttribution {
|
||||||
override fun push(token: Token) {}
|
override fun push(token: Token) {}
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package gay.pizza.pork.parser
|
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 {
|
class LazySkippingTokenSource(val source: TokenSource, val skipping: Set<TokenType>) : ParserAwareTokenSource {
|
||||||
private var index = 0
|
private var index = 0
|
||||||
override val currentIndex: Int
|
override val currentIndex: Int
|
||||||
|
@ -2,6 +2,7 @@ package gay.pizza.pork.parser
|
|||||||
|
|
||||||
import gay.pizza.pork.ast.gen.Node
|
import gay.pizza.pork.ast.gen.Node
|
||||||
import gay.pizza.pork.ast.gen.NodeType
|
import gay.pizza.pork.ast.gen.NodeType
|
||||||
|
import gay.pizza.pork.tokenizer.Token
|
||||||
|
|
||||||
interface NodeAttribution {
|
interface NodeAttribution {
|
||||||
fun push(token: Token)
|
fun push(token: Token)
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.parser
|
||||||
|
|
||||||
import gay.pizza.pork.ast.gen.*
|
import gay.pizza.pork.ast.gen.*
|
||||||
|
import gay.pizza.pork.tokenizer.TokenSource
|
||||||
|
import gay.pizza.pork.tokenizer.TokenType
|
||||||
|
|
||||||
class Parser(source: TokenSource, attribution: NodeAttribution) :
|
class Parser(source: TokenSource, attribution: NodeAttribution) :
|
||||||
ParserBase(source, attribution) {
|
ParserBase(source, attribution) {
|
||||||
|
@ -4,6 +4,7 @@ import gay.pizza.pork.ast.gen.Node
|
|||||||
import gay.pizza.pork.ast.gen.NodeCoalescer
|
import gay.pizza.pork.ast.gen.NodeCoalescer
|
||||||
import gay.pizza.pork.ast.gen.data
|
import gay.pizza.pork.ast.gen.data
|
||||||
import gay.pizza.pork.ast.gen.visit
|
import gay.pizza.pork.ast.gen.visit
|
||||||
|
import gay.pizza.pork.tokenizer.Token
|
||||||
|
|
||||||
data class ParserAttributes(val tokens: List<Token>) {
|
data class ParserAttributes(val tokens: List<Token>) {
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.parser
|
||||||
|
|
||||||
|
import gay.pizza.pork.tokenizer.TokenSource
|
||||||
|
|
||||||
interface ParserAwareTokenSource : TokenSource
|
interface ParserAwareTokenSource : TokenSource
|
||||||
|
@ -3,6 +3,7 @@ package gay.pizza.pork.parser
|
|||||||
import gay.pizza.pork.ast.gen.Node
|
import gay.pizza.pork.ast.gen.Node
|
||||||
import gay.pizza.pork.ast.gen.NodeParser
|
import gay.pizza.pork.ast.gen.NodeParser
|
||||||
import gay.pizza.pork.ast.gen.NodeType
|
import gay.pizza.pork.ast.gen.NodeType
|
||||||
|
import gay.pizza.pork.tokenizer.*
|
||||||
|
|
||||||
abstract class ParserBase(source: TokenSource, val attribution: NodeAttribution) : NodeParser {
|
abstract class ParserBase(source: TokenSource, val attribution: NodeAttribution) : NodeParser {
|
||||||
val source: TokenSource = if (source is ParserAwareTokenSource) {
|
val source: TokenSource = if (source is ParserAwareTokenSource) {
|
||||||
|
@ -3,6 +3,8 @@ package gay.pizza.pork.parser
|
|||||||
import gay.pizza.pork.ast.gen.InfixOperator
|
import gay.pizza.pork.ast.gen.InfixOperator
|
||||||
import gay.pizza.pork.ast.gen.PrefixOperator
|
import gay.pizza.pork.ast.gen.PrefixOperator
|
||||||
import gay.pizza.pork.ast.gen.SuffixOperator
|
import gay.pizza.pork.ast.gen.SuffixOperator
|
||||||
|
import gay.pizza.pork.tokenizer.Token
|
||||||
|
import gay.pizza.pork.tokenizer.TokenType
|
||||||
|
|
||||||
internal object ParserHelpers {
|
internal object ParserHelpers {
|
||||||
fun convertInfixOperator(token: Token): InfixOperator = when (token.type) {
|
fun convertInfixOperator(token: Token): InfixOperator = when (token.type) {
|
||||||
|
@ -3,6 +3,7 @@ package gay.pizza.pork.parser
|
|||||||
import gay.pizza.pork.ast.gen.Node
|
import gay.pizza.pork.ast.gen.Node
|
||||||
import gay.pizza.pork.ast.gen.NodeType
|
import gay.pizza.pork.ast.gen.NodeType
|
||||||
import gay.pizza.pork.ast.gen.data
|
import gay.pizza.pork.ast.gen.data
|
||||||
|
import gay.pizza.pork.tokenizer.Token
|
||||||
|
|
||||||
open class ParserNodeAttribution : NodeAttribution {
|
open class ParserNodeAttribution : NodeAttribution {
|
||||||
private val stack = mutableListOf<MutableList<Token>>()
|
private val stack = mutableListOf<MutableList<Token>>()
|
||||||
|
@ -4,6 +4,7 @@ includeBuild("buildext")
|
|||||||
|
|
||||||
include(
|
include(
|
||||||
":common",
|
":common",
|
||||||
|
":tokenizer",
|
||||||
":ast",
|
":ast",
|
||||||
":parser",
|
":parser",
|
||||||
":frontend",
|
":frontend",
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package gay.pizza.pork.stdlib
|
package gay.pizza.pork.stdlib
|
||||||
|
|
||||||
import gay.pizza.pork.frontend.ContentSource
|
import gay.pizza.pork.frontend.ContentSource
|
||||||
import gay.pizza.pork.parser.CharSource
|
import gay.pizza.pork.tokenizer.CharSource
|
||||||
import gay.pizza.pork.parser.StringCharSource
|
import gay.pizza.pork.tokenizer.StringCharSource
|
||||||
|
|
||||||
object PorkStdlib : ContentSource {
|
object PorkStdlib : ContentSource {
|
||||||
private val stdlibClass = PorkStdlib::class.java
|
private val stdlibClass = PorkStdlib::class.java
|
||||||
|
@ -4,7 +4,7 @@ import com.intellij.lang.BracePair
|
|||||||
import com.intellij.lang.PairedBraceMatcher
|
import com.intellij.lang.PairedBraceMatcher
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
import gay.pizza.pork.parser.TokenType
|
import gay.pizza.pork.tokenizer.TokenType
|
||||||
|
|
||||||
class PorkBraceMatcher : PairedBraceMatcher {
|
class PorkBraceMatcher : PairedBraceMatcher {
|
||||||
override fun getPairs(): Array<BracePair> = arrayOf(
|
override fun getPairs(): Array<BracePair> = arrayOf(
|
||||||
|
@ -3,7 +3,7 @@ package gay.pizza.pork.idea
|
|||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
import com.intellij.psi.tree.TokenSet
|
import com.intellij.psi.tree.TokenSet
|
||||||
import gay.pizza.pork.ast.gen.NodeType
|
import gay.pizza.pork.ast.gen.NodeType
|
||||||
import gay.pizza.pork.parser.TokenType
|
import gay.pizza.pork.tokenizer.TokenType
|
||||||
|
|
||||||
object PorkElementTypes {
|
object PorkElementTypes {
|
||||||
private val tokenTypeToElementType = mutableMapOf<TokenType, IElementType>()
|
private val tokenTypeToElementType = mutableMapOf<TokenType, IElementType>()
|
||||||
|
@ -3,10 +3,10 @@ package gay.pizza.pork.idea
|
|||||||
import com.intellij.lexer.LexerBase
|
import com.intellij.lexer.LexerBase
|
||||||
import com.intellij.openapi.progress.ProcessCanceledException
|
import com.intellij.openapi.progress.ProcessCanceledException
|
||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
import gay.pizza.pork.parser.BadCharacterError
|
import gay.pizza.pork.tokenizer.BadCharacterError
|
||||||
import gay.pizza.pork.parser.StringCharSource
|
import gay.pizza.pork.tokenizer.StringCharSource
|
||||||
import gay.pizza.pork.parser.Tokenizer
|
import gay.pizza.pork.tokenizer.Tokenizer
|
||||||
import gay.pizza.pork.parser.UnterminatedTokenError
|
import gay.pizza.pork.tokenizer.UnterminatedTokenError
|
||||||
import com.intellij.psi.TokenType as PsiTokenType
|
import com.intellij.psi.TokenType as PsiTokenType
|
||||||
|
|
||||||
class PorkLexer : LexerBase() {
|
class PorkLexer : LexerBase() {
|
||||||
|
@ -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.ArgumentSpecElement
|
||||||
import gay.pizza.pork.idea.psi.gen.FunctionCallElement
|
import gay.pizza.pork.idea.psi.gen.FunctionCallElement
|
||||||
import gay.pizza.pork.idea.psi.gen.FunctionDefinitionElement
|
import gay.pizza.pork.idea.psi.gen.FunctionDefinitionElement
|
||||||
import gay.pizza.pork.parser.TokenType
|
import gay.pizza.pork.tokenizer.TokenType
|
||||||
|
|
||||||
@Suppress("UnstableApiUsage")
|
@Suppress("UnstableApiUsage")
|
||||||
class PorkParameterInfoHandler : ParameterInfoHandler<FunctionCallElement, FunctionDefinitionElement> {
|
class PorkParameterInfoHandler : ParameterInfoHandler<FunctionCallElement, FunctionDefinitionElement> {
|
||||||
|
@ -11,7 +11,7 @@ import com.intellij.psi.PsiFile
|
|||||||
import com.intellij.psi.tree.IFileElementType
|
import com.intellij.psi.tree.IFileElementType
|
||||||
import com.intellij.psi.tree.TokenSet
|
import com.intellij.psi.tree.TokenSet
|
||||||
import gay.pizza.pork.idea.psi.gen.PorkElementFactory
|
import gay.pizza.pork.idea.psi.gen.PorkElementFactory
|
||||||
import gay.pizza.pork.parser.TokenType
|
import gay.pizza.pork.tokenizer.TokenType
|
||||||
|
|
||||||
class PorkParserDefinition : ParserDefinition {
|
class PorkParserDefinition : ParserDefinition {
|
||||||
val fileElementType = IFileElementType(PorkLanguage)
|
val fileElementType = IFileElementType(PorkLanguage)
|
||||||
|
@ -6,8 +6,8 @@ import com.intellij.openapi.editor.colors.TextAttributesKey
|
|||||||
import com.intellij.openapi.fileTypes.SyntaxHighlighter
|
import com.intellij.openapi.fileTypes.SyntaxHighlighter
|
||||||
import com.intellij.openapi.fileTypes.SyntaxHighlighterBase
|
import com.intellij.openapi.fileTypes.SyntaxHighlighterBase
|
||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
import gay.pizza.pork.parser.TokenFamily
|
import gay.pizza.pork.tokenizer.TokenFamily
|
||||||
import gay.pizza.pork.parser.TokenType
|
import gay.pizza.pork.tokenizer.TokenType
|
||||||
|
|
||||||
object PorkSyntaxHighlighter : SyntaxHighlighter {
|
object PorkSyntaxHighlighter : SyntaxHighlighter {
|
||||||
override fun getHighlightingLexer(): Lexer {
|
override fun getHighlightingLexer(): Lexer {
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package gay.pizza.pork.idea
|
package gay.pizza.pork.idea
|
||||||
|
|
||||||
import com.intellij.lang.PsiBuilder
|
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
|
import com.intellij.psi.TokenType as PsiTokenType
|
||||||
|
|
||||||
@Suppress("UnstableApiUsage")
|
@Suppress("UnstableApiUsage")
|
||||||
|
7
tokenizer/build.gradle.kts
Normal file
7
tokenizer/build.gradle.kts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
plugins {
|
||||||
|
id("gay.pizza.pork.module")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(":common"))
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
open class AnsiHighlightScheme : HighlightScheme {
|
open class AnsiHighlightScheme : HighlightScheme {
|
||||||
override fun highlight(token: Token): Highlight {
|
override fun highlight(token: Token): Highlight {
|
@ -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"
|
||||||
|
)
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
interface CharConsumer {
|
interface CharConsumer {
|
||||||
fun consume(type: TokenType, tokenizer: Tokenizer): String?
|
fun consume(type: TokenType, tokenizer: Tokenizer): String?
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
fun interface CharMatcher {
|
fun interface CharMatcher {
|
||||||
fun valid(char: Char, index: Int): Boolean
|
fun valid(char: Char, index: Int): Boolean
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
interface CharSource : PeekableSource<Char> {
|
interface CharSource : PeekableSource<Char> {
|
||||||
fun peek(index: Int): Char
|
fun peek(index: Int): Char
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
fun CharSource.readToString(): String = buildString {
|
fun CharSource.readToString(): String = buildString {
|
||||||
while (peek() != CharSource.EndOfFile) {
|
while (peek() != CharSource.EndOfFile) {
|
@ -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)
|
message(got, sourceIndex, expectedTypes)
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
class Highlight(val token: Token, val text: String? = null) {
|
class Highlight(val token: Token, val text: String? = null) {
|
||||||
override fun toString(): String = text ?: token.text
|
override fun toString(): String = text ?: token.text
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
interface HighlightScheme {
|
interface HighlightScheme {
|
||||||
fun highlight(token: Token): Highlight
|
fun highlight(token: Token): Highlight
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
class Highlighter(val scheme: HighlightScheme) {
|
class Highlighter(val scheme: HighlightScheme) {
|
||||||
fun highlight(stream: TokenStream): List<Highlight> =
|
fun highlight(stream: TokenStream): List<Highlight> =
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
@Suppress("CanBeParameter")
|
@Suppress("CanBeParameter")
|
||||||
class MatchedCharConsumer(
|
class MatchedCharConsumer(
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
interface PeekableSource<T> {
|
interface PeekableSource<T> {
|
||||||
val currentIndex: Int
|
val currentIndex: Int
|
@ -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) {
|
data class SourceIndex(val index: Int, val line: Int, val column: Int, val locationReliable: Boolean = true) {
|
||||||
companion object {
|
companion object {
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
class SourceIndexCharSource(val delegate: CharSource) : CharSource by delegate {
|
class SourceIndexCharSource(val delegate: CharSource) : CharSource by delegate {
|
||||||
private var currentLineIndex = 1
|
private var currentLineIndex = 1
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
object StringCharConsumer : CharConsumer {
|
object StringCharConsumer : CharConsumer {
|
||||||
override fun consume(type: TokenType, tokenizer: Tokenizer): String {
|
override fun consume(type: TokenType, tokenizer: Tokenizer): String {
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
class StringCharSource(
|
class StringCharSource(
|
||||||
val input: CharSequence,
|
val input: CharSequence,
|
@ -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) {
|
class Token(val type: TokenType, val sourceIndex: SourceIndex, val text: String) {
|
||||||
override fun toString(): String =
|
override fun toString(): String =
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
enum class TokenFamily : TokenTypeProperty {
|
enum class TokenFamily : TokenTypeProperty {
|
||||||
OperatorFamily,
|
OperatorFamily,
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
interface TokenSource : PeekableSource<Token> {
|
interface TokenSource : PeekableSource<Token> {
|
||||||
fun peekTypeAhead(ahead: Int): TokenType
|
fun peekTypeAhead(ahead: Int): TokenType
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
class TokenStream(val tokens: List<Token>) {
|
class TokenStream(val tokens: List<Token>) {
|
||||||
override fun toString(): String = tokens.toString()
|
override fun toString(): String = tokens.toString()
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
class TokenStreamSource(val stream: TokenStream) : TokenSource {
|
class TokenStreamSource(val stream: TokenStream) : TokenSource {
|
||||||
private var index = 0
|
private var index = 0
|
@ -1,10 +1,10 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
import gay.pizza.pork.parser.CharMatcher.*
|
import gay.pizza.pork.tokenizer.CharMatcher.*
|
||||||
import gay.pizza.pork.parser.MatchedCharConsumer.Options.AllowEofTermination
|
import gay.pizza.pork.tokenizer.MatchedCharConsumer.Options.AllowEofTermination
|
||||||
import gay.pizza.pork.parser.TokenTypeProperty.*
|
import gay.pizza.pork.tokenizer.TokenTypeProperty.*
|
||||||
import gay.pizza.pork.parser.TokenFamily.*
|
import gay.pizza.pork.tokenizer.TokenFamily.*
|
||||||
import gay.pizza.pork.parser.TokenTypeProperty.AnyOf
|
import gay.pizza.pork.tokenizer.TokenTypeProperty.AnyOf
|
||||||
|
|
||||||
enum class TokenType(vararg val properties: TokenTypeProperty) {
|
enum class TokenType(vararg val properties: TokenTypeProperty) {
|
||||||
NumberLiteral(NumericLiteralFamily, CharMatch(CharMatcher.AnyOf(
|
NumberLiteral(NumericLiteralFamily, CharMatch(CharMatcher.AnyOf(
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
interface TokenTypeProperty {
|
interface TokenTypeProperty {
|
||||||
class SingleChar(val char: Char) : TokenTypeProperty
|
class SingleChar(val char: Char) : TokenTypeProperty
|
@ -0,0 +1,3 @@
|
|||||||
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
|
abstract class TokenizeError(message: String) : RuntimeException(message)
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
class Tokenizer(source: CharSource) : TokenSource {
|
class Tokenizer(source: CharSource) : TokenSource {
|
||||||
internal val source = SourceIndexCharSource(source)
|
internal val source = SourceIndexCharSource(source)
|
@ -1,4 +1,4 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
enum class TokenizerState(vararg val transitions: Transition) {
|
enum class TokenizerState(vararg val transitions: Transition) {
|
||||||
Normal(Transition({ TokenType.Quote }) { StringLiteralStart }),
|
Normal(Transition({ TokenType.Quote }) { StringLiteralStart }),
|
@ -1,5 +1,5 @@
|
|||||||
package gay.pizza.pork.parser
|
package gay.pizza.pork.tokenizer
|
||||||
|
|
||||||
class UnterminatedTokenError(what: String, sourceIndex: SourceIndex) : ParseError(
|
class UnterminatedTokenError(what: String, sourceIndex: SourceIndex) : TokenizeError(
|
||||||
"Unterminated $what at $sourceIndex"
|
"Unterminated $what at $sourceIndex"
|
||||||
)
|
)
|
@ -7,7 +7,7 @@ import gay.pizza.dough.fs.PlatformFsProvider
|
|||||||
import gay.pizza.dough.fs.createDirectories
|
import gay.pizza.dough.fs.createDirectories
|
||||||
import gay.pizza.dough.fs.exists
|
import gay.pizza.dough.fs.exists
|
||||||
import gay.pizza.dough.fs.writeString
|
import gay.pizza.dough.fs.writeString
|
||||||
import gay.pizza.pork.parser.readToString
|
import gay.pizza.pork.tokenizer.readToString
|
||||||
import gay.pizza.pork.stdlib.PorkStdlib
|
import gay.pizza.pork.stdlib.PorkStdlib
|
||||||
|
|
||||||
class CopyStdlibCommand : CliktCommand(help = "Copy Stdlib", name = "copy-stdlib") {
|
class CopyStdlibCommand : CliktCommand(help = "Copy Stdlib", name = "copy-stdlib") {
|
||||||
|
@ -4,7 +4,7 @@ import com.github.ajalt.clikt.core.CliktCommand
|
|||||||
import com.github.ajalt.clikt.parameters.arguments.argument
|
import com.github.ajalt.clikt.parameters.arguments.argument
|
||||||
import gay.pizza.dough.fs.PlatformFsProvider
|
import gay.pizza.dough.fs.PlatformFsProvider
|
||||||
import gay.pizza.pork.minimal.FileTool
|
import gay.pizza.pork.minimal.FileTool
|
||||||
import gay.pizza.pork.parser.AnsiHighlightScheme
|
import gay.pizza.pork.tokenizer.AnsiHighlightScheme
|
||||||
|
|
||||||
class HighlightCommand : CliktCommand(help = "Syntax Highlighter", name = "highlight") {
|
class HighlightCommand : CliktCommand(help = "Syntax Highlighter", name = "highlight") {
|
||||||
val path by argument("file")
|
val path by argument("file")
|
||||||
|
@ -4,7 +4,7 @@ import com.github.ajalt.clikt.core.CliktCommand
|
|||||||
import com.github.ajalt.clikt.parameters.arguments.argument
|
import com.github.ajalt.clikt.parameters.arguments.argument
|
||||||
import gay.pizza.dough.fs.PlatformFsProvider
|
import gay.pizza.dough.fs.PlatformFsProvider
|
||||||
import gay.pizza.pork.minimal.FileTool
|
import gay.pizza.pork.minimal.FileTool
|
||||||
import gay.pizza.pork.parser.TokenType
|
import gay.pizza.pork.tokenizer.TokenType
|
||||||
|
|
||||||
class TokenizeCommand : CliktCommand(help = "Tokenize Compilation Unit", name = "tokenize") {
|
class TokenizeCommand : CliktCommand(help = "Tokenize Compilation Unit", name = "tokenize") {
|
||||||
val path by argument("file")
|
val path by argument("file")
|
||||||
|
Reference in New Issue
Block a user