mirror of
				https://github.com/GayPizzaSpecifications/pork.git
				synced 2025-11-03 17:39:38 +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