Exemplo n.º 1
0
        private string TrimComments(string line) {
            if(line == null) {
                if(state != CommentTrimmerState.Normal) {
                    throw new PreprocessingException("unterminated block comment");
                }
                return line;
            }

            StringBuilder output = new StringBuilder(line.Length);
            for (int i = 0; i <= line.Length; ++i) {
                char c = i < line.Length ? line[i] : '\0';
                // Console.WriteLine("'{0}' {1} <{2}>", c, state, output);
                switch(state) {
                    case CommentTrimmerState.Normal:
                        if (c == '/') {
                            state = CommentTrimmerState.AfterSlash;
                        } else if (c == '"') {
                            state = CommentTrimmerState.InStringLiteral;
                            output.Append(c);
                        } else if (c == '\0') {
                            // nothing
                        } else {
                            output.Append(c);
                        }
                        break;
                    case CommentTrimmerState.InStringLiteral:
                        if (c == '"') {
                            state = CommentTrimmerState.Normal;
                            output.Append(c);
                        } else if (c == '\0') {
                            state = CommentTrimmerState.Normal;
                            // btw, this means unterminated string literal
                        } else {
                            output.Append(c);
                        }
                        break;
                    case CommentTrimmerState.AfterSlash:
                        if (c == '/') {
                            state = CommentTrimmerState.InLineComment;
                        } else if (c == '*') {
                            state = CommentTrimmerState.InBlockComment;
                        } else if (c == '\0') {
                            output.Append('/');
                            state = CommentTrimmerState.Normal;
                        } else {
                            output.Append('/');
                            output.Append(c);
                            state = CommentTrimmerState.Normal;
                        }
                        break;
                    case CommentTrimmerState.InBlockComment:
                        if (c == '*') {
                            state = CommentTrimmerState.AfterStar;
                        }
                        break;
                    case CommentTrimmerState.AfterStar:
                        if (c == '/') {
                            state = CommentTrimmerState.Normal;
                        } else if (c == '*') {
                            state = CommentTrimmerState.AfterStar;
                        } else {
                            state = CommentTrimmerState.InBlockComment;
                        }
                        break;
                    case CommentTrimmerState.InLineComment:
                        if (c == '\0') {
                            state = CommentTrimmerState.Normal;
                        }
                        break;
                }
            }
            return output.ToString().Trim();
        }
Exemplo n.º 2
0
        private string TrimComments(string line)
        {
            if (line == null)
            {
                if (state != CommentTrimmerState.Normal)
                {
                    throw new PreprocessingException("unterminated block comment");
                }
                return(line);
            }

            StringBuilder output = new StringBuilder(line.Length);

            for (int i = 0; i <= line.Length; ++i)
            {
                char c = i < line.Length ? line[i] : '\0';
                // Console.WriteLine("'{0}' {1} <{2}>", c, state, output);
                switch (state)
                {
                case CommentTrimmerState.Normal:
                    if (c == '/')
                    {
                        state = CommentTrimmerState.AfterSlash;
                    }
                    else if (c == '"')
                    {
                        state = CommentTrimmerState.InStringLiteral;
                        output.Append(c);
                    }
                    else if (c == '\0')
                    {
                        // nothing
                    }
                    else
                    {
                        output.Append(c);
                    }
                    break;

                case CommentTrimmerState.InStringLiteral:
                    if (c == '"')
                    {
                        state = CommentTrimmerState.Normal;
                        output.Append(c);
                    }
                    else if (c == '\0')
                    {
                        state = CommentTrimmerState.Normal;
                        // btw, this means unterminated string literal
                    }
                    else
                    {
                        output.Append(c);
                    }
                    break;

                case CommentTrimmerState.AfterSlash:
                    if (c == '/')
                    {
                        state = CommentTrimmerState.InLineComment;
                    }
                    else if (c == '*')
                    {
                        state = CommentTrimmerState.InBlockComment;
                    }
                    else if (c == '\0')
                    {
                        output.Append('/');
                        state = CommentTrimmerState.Normal;
                    }
                    else
                    {
                        output.Append('/');
                        output.Append(c);
                        state = CommentTrimmerState.Normal;
                    }
                    break;

                case CommentTrimmerState.InBlockComment:
                    if (c == '*')
                    {
                        state = CommentTrimmerState.AfterStar;
                    }
                    break;

                case CommentTrimmerState.AfterStar:
                    if (c == '/')
                    {
                        state = CommentTrimmerState.Normal;
                    }
                    else
                    {
                        state = CommentTrimmerState.InBlockComment;
                    }
                    break;

                case CommentTrimmerState.InLineComment:
                    if (c == '\0')
                    {
                        state = CommentTrimmerState.Normal;
                    }
                    break;
                }
            }
            return(output.ToString().Trim());
        }