mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-10-10 16:19:37 +00:00
105 lines
4.1 KiB
Kotlin
105 lines
4.1 KiB
Kotlin
package gay.pizza.pork.parser
|
|
|
|
import gay.pizza.pork.parser.TokenTypeProperty.*
|
|
import gay.pizza.pork.parser.TokenFamily.*
|
|
|
|
enum class TokenType(vararg properties: TokenTypeProperty) {
|
|
NumberLiteral(NumericLiteralFamily, CharIndexConsumer { it, index ->
|
|
(it in '0'..'9') || (index > 0 && it == '.') }),
|
|
Symbol(SymbolFamily, CharConsumer {
|
|
(it in 'a'..'z') ||
|
|
(it in 'A'..'Z') ||
|
|
(it == '_') ||
|
|
(it in '0' .. '9')}, KeywordUpgrader),
|
|
StringLiteral(StringLiteralFamily),
|
|
Equality(OperatorFamily),
|
|
Inequality(ManyChars("!="), OperatorFamily),
|
|
ExclamationPoint(SingleChar('!'), Promotion('=', Inequality)),
|
|
None(ManyChars("None"), KeywordFamily),
|
|
Equals(SingleChar('='), Promotion('=', Equality)),
|
|
PlusPlus(ManyChars("++"), OperatorFamily),
|
|
MinusMinus(ManyChars("--"), OperatorFamily),
|
|
Plus(SingleChar('+'), OperatorFamily, Promotion('+', PlusPlus)),
|
|
Minus(SingleChar('-'), OperatorFamily, Promotion('-', MinusMinus)),
|
|
Multiply(SingleChar('*'), OperatorFamily),
|
|
Divide(SingleChar('/'), OperatorFamily),
|
|
And(ManyChars("and"), KeywordFamily),
|
|
Or(ManyChars("or"), KeywordFamily),
|
|
Tilde(SingleChar('~'), OperatorFamily),
|
|
Ampersand(SingleChar('&'), OperatorFamily),
|
|
Pipe(SingleChar('|'), OperatorFamily),
|
|
Caret(SingleChar('^'), OperatorFamily),
|
|
LesserEqual(OperatorFamily),
|
|
GreaterEqual(OperatorFamily),
|
|
Lesser(SingleChar('<'), OperatorFamily, Promotion('=', LesserEqual)),
|
|
Greater(SingleChar('>'), OperatorFamily, Promotion('=', GreaterEqual)),
|
|
LeftCurly(SingleChar('{')),
|
|
RightCurly(SingleChar('}')),
|
|
LeftBracket(SingleChar('[')),
|
|
RightBracket(SingleChar(']')),
|
|
LeftParentheses(SingleChar('(')),
|
|
RightParentheses(SingleChar(')')),
|
|
Not(ManyChars("not"), KeywordFamily),
|
|
Mod(ManyChars("mod"), KeywordFamily),
|
|
Rem(ManyChars("rem"), KeywordFamily),
|
|
Comma(SingleChar(',')),
|
|
DotDotDot(ManyChars("...")),
|
|
DotDot(ManyChars(".."), Promotion('.', DotDotDot)),
|
|
Dot(SingleChar('.'), Promotion('.', DotDot)),
|
|
False(ManyChars("false"), KeywordFamily),
|
|
True(ManyChars("true"), KeywordFamily),
|
|
If(ManyChars("if"), KeywordFamily),
|
|
Else(ManyChars("else"), KeywordFamily),
|
|
While(ManyChars("while"), KeywordFamily),
|
|
For(ManyChars("for"), KeywordFamily),
|
|
In(ManyChars("in"), KeywordFamily),
|
|
Continue(ManyChars("continue"), KeywordFamily),
|
|
Break(ManyChars("break"), KeywordFamily),
|
|
Import(AnyOf("import", "impork", "porkload"), KeywordFamily),
|
|
Export(ManyChars("export"), KeywordFamily),
|
|
Func(ManyChars("func"), KeywordFamily),
|
|
Native(ManyChars("native"), KeywordFamily),
|
|
Let(ManyChars("let"), KeywordFamily),
|
|
Var(ManyChars("var"), KeywordFamily),
|
|
Whitespace(CharConsumer { it == ' ' || it == '\r' || it == '\n' || it == '\t' }),
|
|
BlockComment(CommentFamily),
|
|
LineComment(CommentFamily),
|
|
EndOfFile;
|
|
|
|
val promotions: List<Promotion> =
|
|
properties.filterIsInstance<Promotion>()
|
|
val manyChars: ManyChars? =
|
|
properties.filterIsInstance<ManyChars>().singleOrNull()
|
|
val anyOf: AnyOf? =
|
|
properties.filterIsInstance<AnyOf>().singleOrNull()
|
|
val singleChar: SingleChar? =
|
|
properties.filterIsInstance<SingleChar>().singleOrNull()
|
|
val family: TokenFamily =
|
|
properties.filterIsInstance<TokenFamily>().singleOrNull() ?: OtherFamily
|
|
val charConsumer: CharConsumer? = properties.filterIsInstance<CharConsumer>().singleOrNull()
|
|
val charIndexConsumer: CharIndexConsumer? =
|
|
properties.filterIsInstance<CharIndexConsumer>().singleOrNull()
|
|
val tokenUpgrader: TokenUpgrader? =
|
|
properties.filterIsInstance<TokenUpgrader>().singleOrNull()
|
|
|
|
val simpleWantString: String? = manyChars?.text ?: singleChar?.char?.toString()
|
|
|
|
companion object {
|
|
val AnyOf = entries.filter { item -> item.anyOf != null }
|
|
val ManyChars = entries.filter { item -> item.manyChars != null }
|
|
val SingleChars = entries.filter { item -> item.singleChar != null }
|
|
val CharConsumers = entries.filter { item ->
|
|
item.charConsumer != null || item.charIndexConsumer != null }
|
|
|
|
val ParserIgnoredTypes: Array<TokenType> = arrayOf(
|
|
Whitespace,
|
|
BlockComment,
|
|
LineComment
|
|
)
|
|
|
|
val DeclarationModifiers: Array<TokenType> = arrayOf(
|
|
Export
|
|
)
|
|
}
|
|
}
|