код действия полосы из файла грамматики бизона - PullRequest
2 голосов
/ 25 апреля 2010

Существует ли какой-либо инструмент для удаления всего кода действия из файлов грамматики бизонов, оставляя только {} вокруг него?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2010

Насколько мне известно, нет.

Как вы наверняка знаете, написание собственного инструмента выполнимо, но сложно. Например, символы { и } могут отображаться как символьные константы или в виде строк. (Так же как и символы : и ;, конечно.)

Если у вас есть конкретные файлы, из которых вы хотите удалить действия, и вы можете положиться на собственную среду и ограничения (т.е. вам не нужно решение для общего случая), может быть относительно простой способ сделать это. это.

Если вам нужно полное общее решение, остаётся взломать код бизона. Признаюсь, не для слабонервных. Тем не менее, большая часть зубров реализована или набросана в зубров.

В источниках бизонов см. scan-gram.l и parse-gram.y для команды сканеров / анализаторов бизонов. Токен, на который нужно обратить внимание: BRACED_CODE.

Теперь, поскольку вам нужно взять файл и сгенерировать почти точную его копию, и вам не нужно понимать это, вы, вероятно, сможете выполнить всю свою работу в лексер. Вы можете использовать scan-gram.l в качестве основы для своей работы. Полезной модификацией может быть добавление другого состояния (начального условия), чтобы описать, если вы находитесь в разделе пролог / объявление, по сравнению с правилами грамматики. Все, кроме правил грамматики, должно быть напечатано дословно.

Комментарии, пробелы, директивы, большинство знаков препинания, идентификаторы, цифры: просто распечатайте их дословно.

Символы и строки: они требуют своих собственных состояний в лексере, потому что важно найти, где они заканчиваются. (Символьные литералы могут быть длиннее, чем один символ клавиатуры; представьте восьмеричное.) Но, учитывая, что они имеют свои собственные состояния, выведите их дословно.

Код: как символы и строки, вам нужно выяснить, где он заканчивается. Это тоже немного сложнее, потому что он может содержать строки, комментарии и еще много чего. Но как только вы найдете, где это заканчивается, вы можете выйти из состояния кода. Здесь ничего печатать не нужно (кроме скобок, конечно).

Удачи!

1 голос
/ 02 января 2014

Я знаю, что пост старый, но я столкнулся с той же проблемой и нашел гораздо более простое решение, используя небольшой скрипт на python.

filename = "in.txt";
b_count = 0;
with open("out.txt", "w") as fout:
    with open(filename) as f:
        while True:
            c = f.read(1)
            if not c:
                print "End of file"
                break
            if (b_count == 0):
                fout.write(c);
                if (c == '{'):
                    b_count += 1
            else :
                if (c == '{'):
                    b_count += 1
                if (c == '}'):
                    b_count -= 1
                if (b_count == 0):
                    fout.write('}')

Надеюсь, это кому-нибудь пригодится!

...