В настоящее время я работаю над игрушечным языком, который работает следующим образом: можно встраивать блоки, написанные на этом языке, в источник C++, а перед компиляцией эти блоки переводится на C++ в дополнительном шаг предварительной обработки, создавая действительный источник C++.Экранирование блоков внешнего кода в C++
Я хочу, чтобы эти блоки всегда можно было идентифицировать в источнике однозначно, а также, когда такой блок присутствует в источнике, он не может быть действительным C++. Более того, я хочу их достичь, поставив как можно меньше ограничений на встроенный язык (сам язык по-прежнему несколько жидкий).
Очевидным способом было бы ввести пару специальных многосимвольных круглых скобок, состоящих из символов, которые не могут отображаться вместе в действительном C++-коде (или во встроенном языке). Тем не менее, я не уверен, как убедиться, что особенно последовательность символов хороша для этой цели (а не после GotW #78, в любом случае (:.)
Так что это хороший способ, чтобы избежать этих блоков
Одна вещь, о которой нужно опасаться, - это [Диграфы и триграфы] (http://en.wikipedia.org/wiki/Digraphs_and_trigraphs) –
Исходный строковый литерал может содержать любую последовательность символов (исключая недопустимые последовательности юникода), поэтому нет изолированных последовательностей символов, которые никогда не могут появиться в источнике C++. Вам нужно будет написать простой лексер на C++ (или использовать предварительно написанную на [Boost.Wave] (http://www.boost.org/doc/libs/1_53_0/libs/wave/), а затем просто используйте любую последовательность символов, которая не является частью литерала и которая не является идентификатором или оператором. – Mankarse