Ejemplo n.º 1
0
        protected CodeBlockNodeBase ParseHeaderCodeBlock()
        {
            Eat(TokenType.CloseSquare);

            ShaderCodeToken shaderCode = (ShaderCodeToken)Eat(TokenType.ShaderCode);

            return(new HeaderCodeBlockNode
            {
                Code = shaderCode.ShaderCode
            });
        }
Ejemplo n.º 2
0
        protected CodeBlockNodeBase ParseShaderCodeBlock(IdentifierToken blockName)
        {
            ShaderType shaderType = GetShaderType(blockName);

            // Shader profile is optional.
            ShaderProfile?shaderProfile = null;

            if (PeekType() == TokenType.Identifier)
            {
                IdentifierToken version = (IdentifierToken)Eat(TokenType.Identifier);
                shaderProfile = GetShaderProfile(version);
            }

            Eat(TokenType.CloseSquare);

            ShaderCodeToken shaderCode = (ShaderCodeToken)Eat(TokenType.ShaderCode);

            return(new ShaderCodeBlockNode
            {
                ShaderType = shaderType,
                ShaderProfile = shaderProfile,
                Code = shaderCode.ShaderCode
            });
        }
Ejemplo n.º 3
0
		public Token NextToken()
		{
			EatWhiteSpace();
			StartToken();

			if (PeekChar() == '\0')
				return NewToken(TokenType.Eof);

			char c = NextChar();
			switch (c)
			{
				case '{' :
					return NewToken(TokenType.OpenCurly);
				case '}':
					return NewToken(TokenType.CloseCurly);
				case '(':
					return NewToken(TokenType.OpenParen);
				case ')':
					return NewToken(TokenType.CloseParen);
				case '[':
					return NewToken(TokenType.OpenSquare);
				case ']':
					return NewToken(TokenType.CloseSquare);
				case '=':
					return NewToken(TokenType.Equal);
				case '-':
					return NewToken(TokenType.Minus);
				case ',':
					return NewToken(TokenType.Comma);
				case ':':
					return NewToken(TokenType.Colon);
				case ';':
					return NewToken(TokenType.Semicolon);
				case '/':
				{
					char c2 = PeekChar();
					if (c2 == '/')
					{
						while (!IsEof && !IsLineSeparator(PeekChar()))
							NextChar();
						TakePosition();
						return NextToken();
					}
					ReportError(Resources.LexerUnexpectedCharacter, c);
					return ErrorToken();
				}
				case '"':
				{
					string value = EatWhile(c2 => c2 != '"');
					NextChar(); //Swallow the end of the string constant
					return new StringToken(value, Path, TakePosition());
				}
				case '0':
				case '1':
				case '2':
				case '3':
				case '4':
				case '5':
				case '6':
				case '7':
				case '8':
				case '9':
				{
					// Fairly simple rules
					// - If it contains a dot or ends with "f", then it's a float.
					// If it contains an underscore, then it's a shader profile identifier (i.e. 2_0)
					bool containsDot = false;
					bool containsUnderscore = false;
					Value.Length = 0;
					Value.Append(c);
					while (!IsEof && (PeekChar() == '.' || PeekChar() == '_' || char.IsDigit(PeekChar())))
					{
						char c2 = NextChar();
						switch (c2)
						{
							case '.':
								if (containsDot)
								{
									ReportError(Resources.LexerUnexpectedCharacter, c2);
									return ErrorToken();
								}
								containsDot = true;
								break;
							case '_':
								containsUnderscore = true;
								break;
						}
						Value.Append(c2);
					}
					bool floatSuffix = false;
					if (PeekChar() == 'f')
					{
						floatSuffix = true;
						NextChar();
					}
					if (containsUnderscore)
						return new IdentifierToken(Value.ToString(), Path, TakePosition());
					if (containsDot || floatSuffix)
						return new FloatToken(Convert.ToSingle(Value.ToString()), Path, TakePosition());
					return new IntToken(Convert.ToInt32(Value.ToString()), Path, TakePosition());
				}
				default :
					if (c == HlslDelimiter[0] && PeekIdentifier(HlslDelimiter, 1))
					{
						EatIdentifier(HlslDelimiter, 1);

						string shaderCode = EatWhile(c2 => !IsEof && !PeekIdentifier(HlslDelimiter, 0));
						ShaderCodeToken codeToken = new ShaderCodeToken(shaderCode.Trim(), Path, TakePosition());

						EatIdentifier(HlslDelimiter, 0);

						return codeToken;
					}
					if (IsIdentifierChar(c))
					{
						string identifier = c + EatWhile(IsIdentifierChar);
						if (Keywords.IsKeyword(identifier))
							return new Token(Keywords.GetKeywordType(identifier), Path, TakePosition());
						return new IdentifierToken(identifier, Path, TakePosition());
					}
					ReportError(Resources.LexerUnexpectedCharacter, c);
					return ErrorToken();
			}
		}
Ejemplo n.º 4
0
        public Token NextToken()
        {
            EatWhiteSpace();
            StartToken();

            if (PeekChar() == '\0')
            {
                return(NewToken(TokenType.Eof));
            }

            char c = NextChar();

            switch (c)
            {
            case '{':
                return(NewToken(TokenType.OpenCurly));

            case '}':
                return(NewToken(TokenType.CloseCurly));

            case '(':
                return(NewToken(TokenType.OpenParen));

            case ')':
                return(NewToken(TokenType.CloseParen));

            case '[':
                return(NewToken(TokenType.OpenSquare));

            case ']':
                return(NewToken(TokenType.CloseSquare));

            case '=':
                return(NewToken(TokenType.Equal));

            case '-':
                return(NewToken(TokenType.Minus));

            case ',':
                return(NewToken(TokenType.Comma));

            case ':':
                return(NewToken(TokenType.Colon));

            case ';':
                return(NewToken(TokenType.Semicolon));

            case '/':
            {
                char c2 = PeekChar();
                if (c2 == '/')
                {
                    while (!IsEof && !IsLineSeparator(PeekChar()))
                    {
                        NextChar();
                    }
                    TakePosition();
                    return(NextToken());
                }
                ReportError(Resources.LexerUnexpectedCharacter, c);
                return(ErrorToken());
            }

            case '"':
            {
                string value = EatWhile(c2 => c2 != '"');
                NextChar();                                 //Swallow the end of the string constant
                return(new StringToken(value, Path, TakePosition()));
            }

            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
            {
                // Fairly simple rules
                // - If it contains a dot or ends with "f", then it's a float.
                // If it contains an underscore, then it's a shader profile identifier (i.e. 2_0)
                bool containsDot        = false;
                bool containsUnderscore = false;
                Value.Length = 0;
                Value.Append(c);
                while (!IsEof && (PeekChar() == '.' || PeekChar() == '_' || char.IsDigit(PeekChar())))
                {
                    char c2 = NextChar();
                    switch (c2)
                    {
                    case '.':
                        if (containsDot)
                        {
                            ReportError(Resources.LexerUnexpectedCharacter, c2);
                            return(ErrorToken());
                        }
                        containsDot = true;
                        break;

                    case '_':
                        containsUnderscore = true;
                        break;
                    }
                    Value.Append(c2);
                }
                bool floatSuffix = false;
                if (PeekChar() == 'f')
                {
                    floatSuffix = true;
                    NextChar();
                }
                if (containsUnderscore)
                {
                    return(new IdentifierToken(Value.ToString(), Path, TakePosition()));
                }
                if (containsDot || floatSuffix)
                {
                    return(new FloatToken(Convert.ToSingle(Value.ToString()), Path, TakePosition()));
                }
                return(new IntToken(Convert.ToInt32(Value.ToString()), Path, TakePosition()));
            }

            default:
                if (c == HlslDelimiter[0] && PeekIdentifier(HlslDelimiter, 1))
                {
                    EatIdentifier(HlslDelimiter, 1);

                    string          shaderCode = EatWhile(c2 => !IsEof && !PeekIdentifier(HlslDelimiter, 0));
                    ShaderCodeToken codeToken  = new ShaderCodeToken(shaderCode.Trim(), Path, TakePosition());

                    EatIdentifier(HlslDelimiter, 0);

                    return(codeToken);
                }
                if (IsIdentifierChar(c))
                {
                    string identifier = c + EatWhile(IsIdentifierChar);
                    if (Keywords.IsKeyword(identifier))
                    {
                        return(new Token(Keywords.GetKeywordType(identifier), Path, TakePosition()));
                    }
                    return(new IdentifierToken(identifier, Path, TakePosition()));
                }
                ReportError(Resources.LexerUnexpectedCharacter, c);
                return(ErrorToken());
            }
        }