mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-03 21:21:33 +00:00
implement basic type annotations (not yet used or declarable)
This commit is contained in:
@ -8,7 +8,11 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
|
||||
ParserBase(source, attribution) {
|
||||
override fun parseArgumentSpec(): ArgumentSpec = produce(NodeType.ArgumentSpec) {
|
||||
val symbol = parseSymbol()
|
||||
ArgumentSpec(symbol, next(TokenType.DotDotDot))
|
||||
var typeSpec: TypeSpec? = null
|
||||
if (next(TokenType.Colon)) {
|
||||
typeSpec = parseTypeSpec()
|
||||
}
|
||||
ArgumentSpec(symbol, typeSpec = typeSpec, next(TokenType.DotDotDot))
|
||||
}
|
||||
|
||||
override fun parseBlock(): Block = expect(NodeType.Block, TokenType.LeftCurly) {
|
||||
@ -213,7 +217,10 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
|
||||
parseArgumentSpec()
|
||||
}
|
||||
expect(TokenType.RightParentheses)
|
||||
|
||||
var returnType: TypeSpec? = null
|
||||
if (next(TokenType.Colon)) {
|
||||
returnType = parseTypeSpec()
|
||||
}
|
||||
var native: NativeFunctionDescriptor? = null
|
||||
var block: Block? = null
|
||||
if (peek(TokenType.Native)) {
|
||||
@ -221,7 +228,7 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
|
||||
} else {
|
||||
block = parseBlock()
|
||||
}
|
||||
FunctionDefinition(modifiers, name, arguments, block, native)
|
||||
FunctionDefinition(modifiers = modifiers, symbol = name, arguments = arguments, returnType = returnType, block = block, nativeFunctionDescriptor = native)
|
||||
}
|
||||
|
||||
override fun parseIf(): If = expect(NodeType.If, TokenType.If) {
|
||||
@ -280,18 +287,26 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
|
||||
|
||||
override fun parseLetAssignment(): LetAssignment = expect(NodeType.LetAssignment, TokenType.Let) {
|
||||
val symbol = parseSymbol()
|
||||
var typeSpec: TypeSpec? = null
|
||||
if (next(TokenType.Colon)) {
|
||||
typeSpec = parseTypeSpec()
|
||||
}
|
||||
expect(TokenType.Equals)
|
||||
val value = parseExpression()
|
||||
LetAssignment(symbol, value)
|
||||
LetAssignment(symbol = symbol, typeSpec = typeSpec, value = value)
|
||||
}
|
||||
|
||||
override fun parseLetDefinition(): LetDefinition = produce(NodeType.LetDefinition) {
|
||||
val definitionModifiers = parseDefinitionModifiers()
|
||||
expect(TokenType.Let)
|
||||
val name = parseSymbol()
|
||||
var typeSpec: TypeSpec? = null
|
||||
if (next(TokenType.Colon)) {
|
||||
typeSpec = parseTypeSpec()
|
||||
}
|
||||
expect(TokenType.Equals)
|
||||
val value = parseExpression()
|
||||
LetDefinition(definitionModifiers, name, value)
|
||||
LetDefinition(modifiers = definitionModifiers, symbol = name, typeSpec = typeSpec, value = value)
|
||||
}
|
||||
|
||||
override fun parseListLiteral(): ListLiteral = expect(NodeType.ListLiteral, TokenType.LeftBracket) {
|
||||
@ -375,11 +390,19 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
|
||||
SymbolReference(parseSymbol())
|
||||
}
|
||||
|
||||
override fun parseTypeSpec(): TypeSpec = produce(NodeType.TypeSpec) {
|
||||
TypeSpec(parseSymbol())
|
||||
}
|
||||
|
||||
override fun parseVarAssignment(): VarAssignment = expect(NodeType.VarAssignment, TokenType.Var) {
|
||||
val symbol = parseSymbol()
|
||||
var typeSpec: TypeSpec? = null
|
||||
if (next(TokenType.Colon)) {
|
||||
typeSpec = parseTypeSpec()
|
||||
}
|
||||
expect(TokenType.Equals)
|
||||
val value = parseExpression()
|
||||
VarAssignment(symbol, value)
|
||||
VarAssignment(symbol = symbol, typeSpec = typeSpec, value = value)
|
||||
}
|
||||
|
||||
override fun parseWhile(): While = expect(NodeType.While, TokenType.While) {
|
||||
|
@ -113,6 +113,10 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
|
||||
override fun visitLetAssignment(node: LetAssignment) {
|
||||
append("let ")
|
||||
visit(node.symbol)
|
||||
if (node.typeSpec != null) {
|
||||
append(": ")
|
||||
visit(node.typeSpec!!)
|
||||
}
|
||||
append(" = ")
|
||||
visit(node.value)
|
||||
}
|
||||
@ -121,6 +125,10 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
|
||||
visitDefinitionModifiers(node.modifiers)
|
||||
append("let ")
|
||||
visit(node.symbol)
|
||||
if (node.typeSpec != null) {
|
||||
append(": ")
|
||||
visit(node.typeSpec!!)
|
||||
}
|
||||
append(" = ")
|
||||
visit(node.value)
|
||||
}
|
||||
@ -129,9 +137,17 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
|
||||
visit(node.symbol)
|
||||
}
|
||||
|
||||
override fun visitTypeSpec(node: TypeSpec) {
|
||||
visit(node.symbol)
|
||||
}
|
||||
|
||||
override fun visitVarAssignment(node: VarAssignment) {
|
||||
append("var ")
|
||||
visit(node.symbol)
|
||||
if (node.typeSpec != null) {
|
||||
append(": ")
|
||||
visit(node.typeSpec!!)
|
||||
}
|
||||
append(" = ")
|
||||
visit(node.value)
|
||||
}
|
||||
@ -209,6 +225,10 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
|
||||
}
|
||||
}
|
||||
append(") ")
|
||||
if (node.returnType != null) {
|
||||
append(": ")
|
||||
visit(node.returnType!!)
|
||||
}
|
||||
if (node.block != null) {
|
||||
visit(node.block!!)
|
||||
}
|
||||
|
Reference in New Issue
Block a user