Понимание конечного автомата для обнаружения комментариев в стиле C - PullRequest
1 голос
/ 03 марта 2012

Я понял всю функциональность этой программы, за исключением того, как она обрабатывает ввод вложенных комментариев. Функциональность State Star мне неясна. Что означает c!='*'?

Предположим, что вводом является haha /* hello /*world */, затем после первой звезды, если появляется косая черта, элемент управления переходит в состояние PROGRAM. Однако почему это составляет c!='*'?

#include<stdio.h>
#include<conio.h>

void main()
{
enum{ /*Enum construct declares states */
    PROGRAM,
    SLASH,
    STAR,
    QUOTE,
    COMMENT,
    LITERAL
}state;

/* If state is quote then its either " or '*/

state = PROGRAM;

for(;;)
{
    int c = getchar();
    int quote = 0 ;

    switch(state) {
    case SLASH:
        /* Program text following a slash */
        if (c == '*') {
            state = COMMENT;
            break;
        }
        putchar('/');
        state = PROGRAM;

    case PROGRAM:
        /*Program Text*/
        if (c == '\''||c == '"') {
            state = QUOTE;
            quote = c;
            putchar(quote);
        }
        else if (c == '/')
            state = SLASH;
        else
            putchar(c);
        break;

    case COMMENT:
        /* Comment */
        if (c == '*')
            state = STAR;
        break;

    case STAR:
        /*Comment following a Star */
        if (c == '/')
            state = PROGRAM;
        else if (c != '*') {
            state = COMMENT;
            putchar(' ');
        }
        break;

    case QUOTE:
        /*Within a quote or a string */
        putchar(c);
        if (c == '\\')
            state = LITERAL;
        else if (c == quote)
            state = PROGRAM;
        break;

    case LITERAL:
        /*Within a literal having /*/
        putchar(c);
        state = QUOTE;
        break;
    }
}

printf("Can it handle this /* I wonder */");
getch();
}

Ответы [ 3 ]

1 голос
/ 03 марта 2012

Это справиться с вводом, как это:

blah /* comment **/ blah
                 ^

Если вы вернетесь к COMMENT в точке, которую я отметил, то вы не будете искать / для того, чтобывернуться к PROGRAM.Вам нужно остаться в STAR.

0 голосов
/ 03 марта 2012

Предполагая, что мы находимся в состоянии COMMENT (мы только что встретили '/ *'), этот код будет продолжать цикл, пока не увидит "*".Тем не менее, мы должны выходить из состояния COMMENT только в том случае, если мы видим «/» после «*».Если мы не увидим косую черту, но вернемся в состояние комментария, мы пропустим случаи, когда комментарий заканчивается как «** /», потому что мы не будем продолжать пытаться найти «/» всостояние STAR.Вы вернетесь обратно к COMMENT и посмотрите на c == '/' в следующей итерации, пропустив то, что было фактически концом комментария, а затем пропустите текст программы до следующего '* /'.

0 голосов
/ 03 марта 2012

Если вы находитесь в состоянии STAR и найдете STAR, вы хотите остаться в состоянии STAR, если вы смотрите на что-то вроде ****/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...