lexer — экранирование блоков стороннего кода в переполнении стека

В настоящее время я работаю над игрушечным языком, который работает следующим образом: можно встраивать блоки, написанные на этом языке, в источник C ++, и перед компиляцией эти блоки переводятся в C ++ на дополнительном этапе предварительной обработки, создавая действительный источник C ++.

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

Очевидным способом было бы ввести пару специальных многосимвольных скобок, состоящих из символов, которые не могут появляться вместе в допустимом коде C ++ (или во встроенном языке). Тем не менее, я не уверен, как убедиться, что конкретная последовательность символов подходит для этой цели (не после ПОЛУЧИЛО № 78, тем не мение (: ).

Так что же это хороший способ избежать этих блоков?

0

Решение

Если ваш компилятор можно заставить принять C ++ 11 стандарт, вы могли бы использовать необработанные строковые литералы как например:

  std::cout << R"*(<!DOCTYPE html>
<html>
<head>
<title>Title with a backslash \ here
and double " quote</title>)*";

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


И вы могли бы использовать #{ а также }# как я делаю в MELT макро-строки; ПЛАВИТЬСЯ похож на Лисп предметно-ориентированный язык расширить GCC, и вы можете встроить в него код, например,

(code_chunk hellocount_chk
#{ /* $HELLOCOUNT_CHK chunk */
static int $HELLOCOUNT_CHK#_counter;
$HELLOCOUNT_CHK#_counter++;
$HELLOCOUNT_CHK#_lab:
printf ("Hello World, counted %d\n",
$HELLOCOUNT_CHK#_counter);
if (random() % 4 == 0) goto $HELLOCOUNT_CHK#_lab;
}#)

#{ а также }# заключают в себе макро-строки (эти последовательности символов вряд ли появятся в коде C или C ++, кроме строковых литералов и комментариев), с $ начальные символы в таких макро-строках (до не буквы или # персонаж).

С помощью #{ а также }# не защищен от ошибок (например, из-за необработанных строковых литералов), но достаточно хорош: кооперативный пользователь может избежать их.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector