/// <summary> /// Parse identifier list. Identifier list have the syntax: identifierList ::= stringDelimiter identifier* stringDelimiter /// </summary> /// <param name="token">Token containing the string with the identifier list.</param> /// <param name="parseErrorSink">Error sink for reporting parse errors.</param> /// <param name="sourceCodeService">Source code service that can convert tokens to source code span and reports issues.</param> /// <returns>A collection of sub-tokens if successful or null if token string is illegal.</returns> protected internal virtual IEnumerable <SourceReference <string> > ParseIdentifierList(StringToken token, IParseErrorSink parseErrorSink, ISourceCodeReferenceService sourceCodeService) { if (token == null) { throw new ArgumentNullException("token"); } if (parseErrorSink == null) { throw new ArgumentNullException("parseErrorSink"); } if (sourceCodeService == null) { throw new ArgumentNullException("sourceCodeService"); } List <SourceReference <string> > result = new List <SourceReference <string> >(); if (token.Value.Length == 0) { return(result); } Scanner scanner = new Scanner(new StringReader(token.Value)); Token t = scanner.GetToken(); while (!(t is EofToken)) { // Skip whitespaces (incl. comments). if (!(t is WhitespaceToken)) { // Offset the token to the position within the original token. +1 is due to the opening string ' quote. t.SetTokenValues( new SourceLocation(t.StartPosition.Position + token.StartPosition.Position + 1, t.StartPosition.Line + token.StartPosition.Line, t.StartPosition.Column + token.StartPosition.Column + 1), new SourceLocation(t.StopPosition.Position + token.StartPosition.Position + 1, t.StopPosition.Line + token.StartPosition.Line, t.StopPosition.Column + token.StartPosition.Column + 1), t.ScanError); if (t is IdentifierToken) { // identifier OK result.Add(new SourceReference <string>(((IdentifierToken)t).Value, t.StartPosition, t.StopPosition, sourceCodeService)); } else { // Non-identifier, report error parseErrorSink.AddParserError(t.StartPosition, t.StopPosition, "Expected identifier", t); return(null); // Error condition } } t = scanner.GetToken(); } return(result); }
protected virtual SmalltalkClass.InstanceStateEnum?GetInstanceState(InterchangeFormatProcessor processor, IParseErrorSink parseErrorSink, ISourceCodeReferenceService sourceCodeService) { if (this.IndexedInstanceVariables.Value == "byte") { return(SmalltalkClass.InstanceStateEnum.ByteIndexable); } else if (this.IndexedInstanceVariables.Value == "object") { return(SmalltalkClass.InstanceStateEnum.ObjectIndexable); } else if (this.IndexedInstanceVariables.Value == "none") { return(SmalltalkClass.InstanceStateEnum.NamedObjectVariables); } else { parseErrorSink.AddParserError(this.IndexedInstanceVariables.StartPosition, this.IndexedInstanceVariables.StopPosition, "Invalid instance state type. Allowed values are: #byte, #object and #none.", this.IndexedInstanceVariables); return(null); } }
/// <summary> /// Parse identifier list. Identifier list have the syntax: identifierList ::= stringDelimiter identifier* stringDelimiter /// </summary> /// <param name="token">Token containing the string with the identifier list.</param> /// <param name="parseErrorSink">Error sink for reporting parse errors.</param> /// <param name="sourceCodeService">Source code service that can convert tokens to source code span and reports issues.</param> /// <returns>A collection of sub-tokens if successful or null if token string is illegal.</returns> protected internal virtual IEnumerable<SourceReference<string>> ParseIdentifierList(StringToken token, IParseErrorSink parseErrorSink, ISourceCodeReferenceService sourceCodeService) { if (token == null) throw new ArgumentNullException("token"); if (parseErrorSink == null) throw new ArgumentNullException("parseErrorSink"); if (sourceCodeService == null) throw new ArgumentNullException("sourceCodeService"); List<SourceReference<string>> result = new List<SourceReference<string>>(); if (token.Value.Length == 0) return result; Scanner scanner = new Scanner(new StringReader(token.Value)); Token t = scanner.GetToken(); while (!(t is EofToken)) { // Skip whitespaces (incl. comments). if (!(t is WhitespaceToken)) { // Offset the token to the position within the original token. +1 is due to the opening string ' quote. t.SetTokenValues( new SourceLocation(t.StartPosition.Position + token.StartPosition.Position + 1, t.StartPosition.Line + token.StartPosition.Line, t.StartPosition.Column + token.StartPosition.Column + 1), new SourceLocation(t.StopPosition.Position + token.StartPosition.Position + 1, t.StopPosition.Line + token.StartPosition.Line, t.StopPosition.Column + token.StartPosition.Column + 1), t.ScanError); if (t is IdentifierToken) { // identifier OK result.Add(new SourceReference<string>(((IdentifierToken)t).Value, t.StartPosition, t.StopPosition, sourceCodeService)); } else { // Non-identifier, report error parseErrorSink.AddParserError(t.StartPosition, t.StopPosition, "Expected identifier", t); return null; // Error condition } } t = scanner.GetToken(); } return result; }
protected virtual SmalltalkClass.InstanceStateEnum? GetInstanceState(InterchangeFormatProcessor processor, IParseErrorSink parseErrorSink, ISourceCodeReferenceService sourceCodeService) { if (this.IndexedInstanceVariables.Value == "byte") return SmalltalkClass.InstanceStateEnum.ByteIndexable; else if (this.IndexedInstanceVariables.Value == "object") return SmalltalkClass.InstanceStateEnum.ObjectIndexable; else if (this.IndexedInstanceVariables.Value == "none") return SmalltalkClass.InstanceStateEnum.NamedObjectVariables; else { parseErrorSink.AddParserError(this.IndexedInstanceVariables.StartPosition, this.IndexedInstanceVariables.StopPosition, "Invalid instance state type. Allowed values are: #byte, #object and #none.", this.IndexedInstanceVariables); return null; } }