From d7c797e4026ef41ef25fd0ca55c6872ae97a4064 Mon Sep 17 00:00:00 2001 From: "Brian T. Rice" Date: Thu, 3 Mar 2011 07:23:09 -0800 Subject: [PATCH] Parser changes to clean up and extract method Signature parsing from MethodDefinition parsing. --- src/syntax/assignment.slate | 6 ++ src/syntax/node.slate | 7 ++- src/syntax/parser.slate | 145 +++++++++++++++++++++----------------------- src/syntax/print.slate | 2 +- 4 files changed, 80 insertions(+), 80 deletions(-) diff --git a/src/syntax/assignment.slate b/src/syntax/assignment.slate index ded21d0..36f9a5f 100644 --- a/src/syntax/assignment.slate +++ b/src/syntax/assignment.slate @@ -93,6 +93,12 @@ array@(nodes Array traits) setTo: vals &environment: env {tmpVar store: vals. result} as: nodes Parenthesis]] ]. +sig@(nodes Signature traits) setTo: body@(nodes Block traits) &environment: env +[| result | + result: (body as: (sig as: nodes MethodDefinition)). + result +]. + load@(nodes LoadVariable traits) defaultsTo: default &environment: env "A macro that expands to an expression that sets a variable in the scope to the expression in the default." diff --git a/src/syntax/node.slate b/src/syntax/node.slate index 85bd010..4f17bd9 100644 --- a/src/syntax/node.slate +++ b/src/syntax/node.slate @@ -774,7 +774,7 @@ block@(nodes Block traits) deepCopy &into: target block@(nodes Block traits) as: target@(nodes Block traits) "This should allow Block and MethodDefinition objects to be converted (with loss of Signature information, of course." -[block deepCopy &into: target]. +[block deepCopy &into: target new]. block@(nodes Block traits) arity [block inputVariables size]. @@ -936,7 +936,7 @@ method@(nodes MethodDefinition traits) as: sig@(nodes Signature traits) [selector := method selector. roles := method roles. inputVariables := method inputVariables. - inputVariables do: [| :var | var scope := Nil]. + inputVariables do: [| :var | var scope := sig]. restVariable := method restVariable. optionalKeywords := method optionalKeywords. optionalVariables := method optionalVariables. ] @@ -953,7 +953,8 @@ sig@(nodes Signature traits) as: method@(nodes MethodDefinition traits) localVariables := result inputVariables copy. restVariable := sig restVariable. optionalKeywords := sig optionalKeywords. - optionalVariables := sig optionalVariables. ] + optionalVariables := sig optionalVariables. + optionalVariables do: [| :var | var scope := result]. ] ]. node1@(nodes Signature traits) = node2@(nodes Signature traits) diff --git a/src/syntax/parser.slate b/src/syntax/parser.slate index 4cfc67b..d1459e7 100644 --- a/src/syntax/parser.slate +++ b/src/syntax/parser.slate @@ -432,82 +432,75 @@ p@(Parser traits) nextBlock &updating: block block ]. -p@(Parser traits) nextSignatureOrDefinition -"Parses and returns a method definition, which has the highest precedence." -[| selector roles inputVariables optKeywords optVariables token result | - selector := Nil. - roles := #{} writer. - inputVariables := #{} writer. - optKeywords := #{} writer. +p@(Parser traits) parseRoleAnnotationFor: sig@(nodes Signature traits) +[| token | + (token := p nextToken) == tokens At + ifTrue: [sig roles := sig roles copyWith: p nextAtom] + ifFalse: [p undoToken: token. sig roles := sig roles copyWith: ((nodes Literal for: NoRole) recordPositionFrom: p)]. + sig +]. + +p@(Parser traits) parseInputVariableFor: sig@(nodes Signature traits) +[| token | + (Syntax isUnarySelector: (token := p nextToken)) + ifTrue: [sig inputVariables := sig inputVariables copyWith: (p newVariableNamed: token value in: sig). + p parseRoleAnnotationFor: sig] + ifFalse: [p undoToken: token]. "TODO conditionally throw an error? or check for / handle a pattern" + sig +]. + +p@(Parser traits) parseOptionalKeywordsFor: sig@(nodes Signature traits) +[| token optKeywords optVariables | optVariables := #{} writer. - result := nodes MethodDefinition new recordPositionFrom: p. - [(token := p nextToken) isSameAs: tokens BeginBlock] - whileFalse: - [| variable | - (Syntax isUnarySelector: token) - ifFalse: [p error: 'Bad input variable name in method signature: ' ; token printString]. - variable := p newVariableNamed: token value in: result. - token := p nextToken. - optKeywords size isZero - ifTrue: - [inputVariables nextPut: variable. - token == tokens At - ifTrue: [roles nextPut: p nextAtom. token := p nextToken] - ifFalse: [roles nextPut: ((nodes Literal for: NoRole) recordPositionFrom: p)]. - (token isSameAs: tokens Selector) - ifTrue: - [selector isNotNil - /\ [(Syntax isOptionalSelector: token) not] - /\ [(Syntax isKeywordSelector: selector) not - \/ [(Syntax isKeywordSelector: token) not]] - ifTrue: - [p error: 'Bad selector name in method signature: ' ; selector]. - (Syntax isUnarySelector: token) - ifTrue: - [selector := token value. - (Syntax isOptionalSelector: p peekToken) - ifTrue: [token := p nextToken]]. - (Syntax isBinarySelector: token) - ifTrue: - [selector := token value]. - (Syntax isKeywordSelector: token) - ifTrue: - [selector := selector - ifNil: [token value] - ifNotNil: [selector ; token value]]. - (Syntax isOptionalSelector: token) - ifTrue: - [optKeywords nextPut: token value intern]] - ifFalse: - [p undoToken: token. - token == tokens BeginBlock ifFalse: - [^ ((result `>> - [selector := selector intern. - roles := roles contents. - inputVariables := inputVariables contents. - optionalKeywords := optKeywords contents. - optionalVariables := optVariables contents. ] - as: nodes Signature) recordPositionFrom: p)]]] - ifFalse: - [optVariables nextPut: variable. - (Syntax isOptionalSelector: token) - ifTrue: [optKeywords nextPut: token value intern] - ifFalse: - [p undoToken: token. - (token isSameAs: tokens BeginBlock) - ifFalse: - [^ ((result `>> - [selector := selector intern. - roles := roles contents. - inputVariables := inputVariables contents. - optionalKeywords := optKeywords contents. - optionalVariables := optVariables contents. ] - as: nodes Signature) recordPositionFrom: p)]]]]. - selector ifNil: [p error: 'No selector name specified in method definition']. + optKeywords := + [| :optKeywords | + [Syntax isOptionalSelector: (token := p nextToken)] + whileTrue: + [token value last = $: + ifTrue: [optKeywords nextPut: token value intern. + (Syntax isUnarySelector: (token := p nextToken)) + ifTrue: [optVariables nextPut: (p newVariableNamed: token value in: sig)] + ifFalse: [p undoToken: token]] + ifFalse: [optKeywords nextPut: (token value ; ':') intern. + optVariables nextPut: (p newVariableNamed: token value in: sig)]]. + p undoToken: token] + writingAs: #{}. + optKeywords ifNotEmpty: + [sig optionalKeywords := optKeywords. + sig optionalVariables := optVariables contents]. + sig +]. + +p@(Parser traits) nextSignature +[| selector token result | + selector := Nil. + result := nodes Signature new recordPositionFrom: p. + + p parseInputVariableFor: result. + token := p nextToken. + `conditions: { + [Syntax isUnarySelector: token] -> [selector := token value]. + [Syntax isBinarySelector: token] -> [selector := token value. p parseInputVariableFor: result]. + [Syntax isKeywordSelector: token] -> + [selector := ''. + [selector := selector ; token value. + p parseInputVariableFor: result. + Syntax isKeywordSelector: (token := p nextToken)] whileTrue. p undoToken: token] + } otherwise: [p error: 'Signature unexpectedly contains: ' ; token signifier]. + + selector ifNil: [p error: 'No selector name specified in signature']. result selector := selector intern. - result roles := roles contents. - result inputVariables := inputVariables contents. - result optionalKeywords := optKeywords contents. - result optionalVariables := optVariables contents. - p nextBlock &updating: result + p parseOptionalKeywordsFor: result +]. + +p@(Parser traits) parseMethodDefinitionFor: sig@(nodes Signature traits) +[| token | + ((token := p nextToken) isSameAs: tokens BeginBlock) + ifTrue: [p nextBlock &updating: (sig as: nodes MethodDefinition)] + ifFalse: [p undoToken: token. sig] +]. + +p@(Parser traits) nextSignatureOrDefinition +[ + p parseMethodDefinitionFor: p nextSignature ]. diff --git a/src/syntax/print.slate b/src/syntax/print.slate index 14da570..3b21013 100644 --- a/src/syntax/print.slate +++ b/src/syntax/print.slate @@ -343,7 +343,7 @@ source on the stream." w newColumn. w ; selector name. w newColumn. - w ; variable name]]. + w ; variable name name]]. ]. w@(SourcePrintStream traits) printSignatureOf: node@(nodes MethodDefinition traits) -- 2.11.4.GIT