как разделить общее определение между c и tcl - PullRequest
0 голосов
/ 25 марта 2012

В целях тестирования мне нужно поделиться некоторыми определениями между Tcl и C. Можно ли включить включаемый файл в стиле C в сценарии Tcl?Любое альтернативное предложение будет приветствоваться, но я предпочитаю не писать анализатор для заголовочного файла C.

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

SWIG поддерживает Tcl, поэтому, возможно, вы сможете использовать это.Также я помню, как видел некоторый код для разбора заголовков C на вики Tcl - так что вы можете попробовать посмотреть страницу Parsing C там.Это должно спасти вас писать один с нуля.

0 голосов
/ 26 марта 2012

Если вы используете полный API любой сложности, вам лучше использовать SWIG (или critcl ) для связывания. SWIG может выполнять связывание между C API и Tcl с очень небольшим пользовательским вводом (часто почти без). Следует отметить, что API, которые он производит, не очень естественны с точки зрения Tcl (поскольку Tcl не C и имеет разные идиомы).

Тем не менее, если вместо этого вам нужен какой-то способ обработки только самых простых частей определений - всего лишь #define числовых констант - тогда самый простой способ справиться с этим - немного разобрать регулярные выражения:

proc getDefsFromIncludeFile {filename} {
    set defs {}
    set f [open $filename]
    foreach line [split [read $f] "\n"] {
        # Doesn't handle all edge cases, but does do a decent job
        if {[regexp {^\s*#\s*define\s+(\w+)\s+([^\s\\]+)} $line -> def val]} {
            lappend defs $def [string trim $val "()"]
        }
    }
    close $f
    return $defs
}

Это делает достаточно похвальную работу над собственными заголовками Tcl. (Обработка условных определений и вложенных операторов #include оставлена ​​в качестве упражнения; я предлагаю вам попытаться расположить заголовки C таким образом, чтобы сделать это упражнение ненужным.) Когда я это делаю, извлекаются первые несколько определений:

TCL_ALPHA_RELEASE 0 TCL_BETA_RELEASE 1 TCL_FINAL_RELEASE 2 TCL_MAJOR_VERSION 8

Critcl - это другой способ связывания Tcl / C, и он работает, внедряя язык C в Tcl. Он может создавать очень естественные интерфейсы Tcl для кода C; Я думаю, это здорово. Однако я не думаю, что это может быть полезно для того, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...