2016-06-07 4 views
1

Я хочу проанализировать файл .h с помощью пакетного скрипта. В файле .h есть некоторые, может быть Структуры выглядеть следующим образом:В пакетном режиме не удается правильно прочитать «*» из файла

typedef struct _sample { 
    int *a; 
    char* b; 
    float * c; 
} Sample; 

Как вы можете видеть, «*» может быть где-нибудь между типом данных и именем элемента. Ниже то, что я написал в моем .bat файл (упрощенно):

for /F "tokens=*" %%i in (sample.h) do (
    for %%j in (%%i) do echo %%j 
) 

Что это .bat сделать, это повторить каждое слово, которое он читал, так как я упростил. Результат:

typedef 
struct 
_sample 
{ 
int   ::"*a" is skipped 
b   ::"char*" is skipped 
float 
sample.bat ::"*" is solved as reading current path files 
sample.h 
c 
} 
Sample 

Так вопрос: Как я могу проанализировать эти 3 вида декларации указателя с «*» правильно?

+0

Простой 'for' цикл использует' * '(а также'? ') В качестве маски, так что если какой-либо из пунктов после 'в' ключевое слово содержит такие,' for' доступ к файловой системе и производит поиск для сопоставления элементов, которые затем возвращаются в случае; если не используются подстановочные знаки, файловая система не имеет доступа, и элементы возвращаются напрямую 'for' ... – aschipfl

+0

Это был бы большой шаг от сценариев cmd, но если вы действительно хотите проанализировать код, ANTLR будет хорошим выбор. Существует сильная поддержка синтаксиса языка C. http://www.antlr.org/ – lit

ответ

-1

В соответствии с for /? выход:

tokens=x,y,m-n - specifies which tokens from each line are to 
        be passed to the for body for each iteration. 
        This will cause additional variable names to 
        be allocated. The m-n form is a range, 

Примечание Эта часть:

    specifying the mth through the nth tokens. If 
        the last character in the tokens= string is an 
        asterisk, then an additional variable is 
        allocated and receives the remaining text on 
        the line after the last token parsed. 
+1

Это не отвечает на вопрос! реальной проблемой является простой цикл 'for', который использует' * '(а также'? ') в качестве подстановочных знаков ... – aschipfl

1

как сказал aschipfl, for интерпретирует * и ? как подстановочные знаки и расширяет их к коврику ching имена файлов. Чтобы обойти это, вы должны интерпретировать строки вне цикла for:

@echo off 
for /F "delims=" %%i in (t.txt) do call :doit %%i 
goto :eof 

:doit 
if "%1"=="" goto :eof 
echo %1 
shift 
goto :doit 
+0

Это хороший первый снимок, но это ошибка, подверженная c-коду с произвольными текстами, например' if (val & 1) printf ("val & 1 is true"); ' – jeb

0

При попытке разобрать код C, вы должны использовать более стабильную версию.
Поскольку FOR/F выдает пустые строки и линии, начиная с ;.

Также расщепление самой линии может быть выполнено с использованием новых линий безопасным способом.

setlocal DisableDelayedExpansion 
(set \n=^ 
%=EMPTY=% 
) 
for /F "usebackq delims=" %%L in (`findstr /n "^" t2.txt`) do (
    set "line=%%L" 
    setlocal EnableDelayedExpansion 
    set "line=!line:*:=!" 
    echo LINE: !line! 
    FOR %%N in ("!\n!") do set "parts= !line: =%%~N !" 
    FOR /F "delims=" %%p in ("!parts!") do (
     echo( %%p 
    ) 
    endlocal 
) 
+0

Спасибо! Он отлично работает! – pcler