Правила препроцессора и пробелов - PullRequest
2 голосов
/ 03 февраля 2011

Я заинтересован в определении моего собственного языка внутри блока C ++ (скажем, например, main), и для этой цели мне нужно использовать препроцессор и его директивы, моя проблема опирается на следующее правило:

#define INSERT create() ... 

Называется функционально-подобным определением, и препроцессор не допускает никаких пробелов в том, что мы определяем,

Поэтому, когда я использую функцию на своем собственном языке, я получаю парсинг справа под следующим утверждением:

INSERT INTO variable_name VALUES(arg_list)

для двух разных вызовов функций, скажем,

insertINTO(variable_name) and valuePARSE(arg_list) 

, но так как правила директивы препроцессора не позволяют мне иметь пробелы в моем определении, как я могу получить имя_переменной, а затем сделать вызовдо первого вызова функции, которую я хочу достичь?

Любые подсказки были бы полезны.

PS: я пытался использовать g ++ -E file.cpp, чтобы увидеть, как работает препроцессор, и настроить синтаксис, чтобы он действовал в правилах c ++.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2011

1) define INSERT create() - это не функциональный макрос, а объектный, что-то вроде define INSERT(a, b, c) create(a, b, c) было бы;

2), если вы хотите расширить INSERT INTO variable_name VALUES(arg_list) в insertINTO(variable_name); valuePARSE(arg_list);, вы можетесделайте что-то вроде:

#define INSERT insertINTO(
#define INTO 
#define VALUES(...) ); valueParse(__VA_ARGS__);

3) так как вы видите, что макросы становятся довольно уродливыми, и даже из-за малейшей ошибки в вашем синтаксисе вы потратите много времени на его отслеживание

4) поскольку он помечен как C ++, взгляните на Boost.Proto или Boost.Preprocessor .

0 голосов
/ 03 февраля 2011

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

Если вы действительно хотите определить свой язык таким образом, я предлагаю вам либо написать свой собственный препроцессор, либо использовать более мощный, чем по умолчанию. Здесь - один из тех, кто пытался использовать Python в качестве препроцессора C ++.

...