трудность, получающая c-стиль, комментирует в гибком проводе/законе

Я хочу сделать правило в гибком проводе для потребления комментария c-стиля как/* */

у меня есть следующее

c_comment "/*"[\n.]*"*/"

Но это никогда не становится подобранным. Какая-либо идея, почему? если Вам нужно больше моего кода, сообщенного мне, и я отправлю все это. Благодаря любому, кто отвечает.

29
задан lesmana 6 May 2013 в 11:44
поделиться

2 ответа

Я предлагаю вам использовать начальные условия вместо этого.

%x C_COMMENT

"/*"            { BEGIN(C_COMMENT); }
<C_COMMENT>"*/" { BEGIN(INITIAL); }
<C_COMMENT>\n   { }
<C_COMMENT>.    { }

Обратите внимание, что там не должно быть любым пробелом между <условием> и правилом.

% X C_Comment определяет состояние C_COMMENT, и правило / * начнется. Как только это началось, * / будет вернуться к начальному состоянию ( начальный , предварительно определен), и все другие символы будут просто потреблены без каких-либо конкретных действий. Когда два правила совпадают, Flex Rambugrates, принимая тот, который имеет самый длинный матч, поэтому правило точечного не предотвращается * / . Правило \ N необходимо, потому что точка соответствует всему, кроме новой строки .

Определение % x [1187009] составляет исключительное состояние , что означает, что лексера будет соответствовать только правилам, которые «помечены» . штат.

Вот крошечный пример лексера , который реализует этот ответ, печатая все, кроме того, что находится внутри / * Комментарии * / .

42
ответ дан 28 November 2019 в 01:22
поделиться
- 4213529-

Не уверены, почему он не поднимается, но я знаю, что шаблон такого рода может производить большие лексические элементы. Более эффективно обнаруживать только начальный комментарий и бросить все в BitBucket, пока не найдете конечный маркер.

Этот сайт имеет код, который сделает это:

"/*" {
    for (;;) {
        while ((c = input()) != '*' && c != EOF)
            ; /* eat up text of comment */
        if (c == '*') {
            while ((c = input()) == '*')
                ;
            if (c == '/')
                break; /* found the end */
        }
        if (c == EOF) {
            error ("EOF in comment");
            break;
        }
    }
}
7
ответ дан 28 November 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: