Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с регеспами 
:(
    Опции темы
hasuhands
Дата 5.8.2005, 21:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть скрипт, которые удаляет комментарии из c++ файлов

Код
# Clear Internal Comments
# Author: (c) Martinov G.M.
# created 18.01.2003  v.0.0.1
# modified 04.05.2003 v.0.0.2 - GM
#   1. trace the founded internal comments
#   2. adapt command line arguments to Windows XP


$sourcePath = 'C:\NCsSoft';                 # value by default
$fileTypes = '(.h$)|(.cpp$)|(.hpp$)';       # value by default
$silent = 0;                                # switch on/off traces 
$version = "0.0.2";                         


# ============= sub ClearInternalComments ====================================================
# Clear Internal comments
#Parameters: $_[0] - file name
sub ClearInternalComments  
{                 
 #Parameters: $_[0] - file name 
  undef $/  if ($/ eq "\n" );                   # mode of absorption whole file
  
  open HANDLE, $_[0] or die "Cant open $_[0]:  $!";
  $_ = <HANDLE>;
  
#  print ;     # for debug
  s%
      # Сначало перечисляется то, что совпадает но не удаляется
      (
          [^"'/]+                               # Все остальное 
        |                                       # or
          (?:"[^"\\]*(?:\\.[^"\\]*)*" [^"'/]*)+  # line in double quotes
        |
          (?:'[^"\\]*(?:\\.[^'\\]*)*' [^"'/]*)+ # line in quotes (апостьроф)
        |                                       # or
      )  
    |
          # ... коментарий. Поскольку он не совпал с круглами скобками $1,
          # коментарии исчезнут, когда мы используем $1 в качестве текста замены.
          / (?:                                 # любой коментарий начинается с косой чертой
              \*[^*]*\*+(?:[^/*][^*]*\*+)*/     # Traditional comment of C
          |                                     # or
            /[^\n]*                             # Coment of C++ (//)
            )
  %$1%gsx;
  
  close HANDLE;
  open HANDLE, ">$_[0]" or die "Cant open $_[0] for writing:  $!";
  print HANDLE $_;                                    # print in destination file without comments
  
 #------------------
  
  close HANDLE;
  
  $/ = "\n" if ($/ ne "\n" );                   #define again
#  print ;     # for debug
  return $_;
} # End sub ClearC++Coments  


# ============= sub DirLoop ====================================================
# parametr $_[0] is DirName
sub DirLoop             
{ 
  opendir (CURRENT_DIR, $_[0])  
    or die "Cant open $_[0]:  $!";

  print "----------------------------------- \n"  if($silent == 0);  # TRACE
  print "Open dir $_[0] \n"  if($silent == 0);  # TRACE
  
  # directory loop
  foreach $File (readdir CURRENT_DIR)  
  {
    if (-f "$_[0]/$File" && $File=~m/\w+$fileTypes/i)
    { # one of files
        &ClearInternalComments("$_[0]/$File"); 
    }
    elsif (-d "$_[0]/$File" && $File=~m/\w+/ )
    { # subdirectory
      &DirLoop("$_[0]/$File");
    }
  }
  closedir(CURRENT_DIR);
}

#=================================================================================

print "> $0 ".join (', ',  @ARGV)."\n\n";;  # TRACE start line

print "Clear internal comments, Internal_conments_x.pl version $version \n\n"  if($silent == 0); # trace

#------------ command line arguments handling
if ( $ARGV[0] eq '/?' || $ARGV[0] eq '|?'  || $ARGV[0] eq '-?')
{ # help call
  print "  command line: %perl Internal_conments_x.pl [-?] [/?] [|?]\n"."            or \n";
  print "              : %perl Internal_conments_x.pl [SourcePath] [FileTypes] [-s]\n";
  print "  arguments: \n    [/?] or [|?] - this help\n";
  print "    [SourcePath] - path to source subdirectory\n    [FileTypes]  - file type to be cleared (delimiter is symbol ':')\n";
  print "    [-s]         - silent\n\n";
  print "  exempla for analyzing *.h and *.cpp files:\n    %perl Internal_conments_x.pl $sourcePath *.h:*.cpp\n";
  $#ARGV = -1; 
  print "\n"."Press <Enter> to close";  
  exit if ( <> );
}
elsif ($#ARGV > -1)
{ # handling arguments for path and file type
  $sourcePath = $ARGV[0]    if (-d $ARGV[0]);
  
  @FileTypeArray = split(/:/, $ARGV[1]);
  foreach $TypeItem (@FileTypeArray)
  {
    $TypeItem =~ s/\*//;                    # delete '*'
    $TypeItem = '('.$TypeItem.'$)';         # like (.h$)
  }
  $ARGV[1] = join('|', @FileTypeArray);
  $fileTypes = $ARGV[1]     if ($ARGV[1] ne ''); 
  
  $silent = 1   if ($ARGV[2] =~ m/^-s$/i);
  $#ARGV = -1;                              # clear arguments
}

#----------------------------
-e($sourcePath) or die " Directory $sourcePath doesn't exist  $!";
print "Looking in node: $sourcePath\n"."for files with extension: $fileTypes\n \n";
  
&DirLoop($sourcePath);

print "End!  Press <Enter> to close"; <>



Скрипт не мой. При тестировании скрипта на своих прирах все работало хорошо. Как только начал использовать его в полевый условиях - начал глючить. Например, следующий файл парсится очень коряво:
Код
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
#include "nsIAtom.h"
#include "nsParserNode.h" 
#include <string.h>
#include "nsHTMLTokens.h"
#include "nsITokenizer.h"
#include "nsDTDUtils.h"


/**
 *  Default Constructor
 */
nsCParserNode::nsCParserNode()
  : mToken(nsnull),
    mUseCount(0),
    mGenericState(PR_FALSE),
    mTokenAllocator(nsnull)
{
  MOZ_COUNT_CTOR(nsCParserNode);
#ifdef HEAP_ALLOCATED_NODES
  mNodeAllocator = nsnull;
#endif
}

/**
 *  Constructor
 *  
 *  @update  gess 3/25/98
 *  @param   aToken -- token to init internal token
 *  @return  
 */
nsCParserNode::nsCParserNode(CToken* aToken,
                             nsTokenAllocator* aTokenAllocator,
                             nsNodeAllocator* aNodeAllocator): nsIParserNode() 
{
  mRefCnt = 0;
  MOZ_COUNT_CTOR(nsCParserNode);

  static int theNodeCount = 0;
  ++theNodeCount;
  mToken = aToken;
  IF_HOLD(mToken);
  mTokenAllocator = aTokenAllocator;
  mUseCount = 0;
  mGenericState = PR_FALSE;
#ifdef HEAP_ALLOCATED_NODES
  mNodeAllocator = aNodeAllocator;
#endif
}

/**
 *  default destructor
 *  NOTE: We intentionally DONT recycle mToken here.
 *        It may get cached for use elsewhere
 *  @update  gess 3/25/98
 *  @param   
 *  @return  
 */
nsCParserNode::~nsCParserNode() {
  MOZ_COUNT_DTOR(nsCParserNode);
  ReleaseAll();
#ifdef HEAP_ALLOCATED_NODES
  if(mNodeAllocator) {
    mNodeAllocator->Recycle(this);
  }
  mNodeAllocator = nsnull;
#endif
  mTokenAllocator = 0;
}


/**
 *  Init
 *  
 *  @update  gess 3/25/98
 *  @param   
 *  @return  
 */

nsresult
nsCParserNode::Init(CToken* aToken,
                    nsTokenAllocator* aTokenAllocator,
                    nsNodeAllocator* aNodeAllocator) 
{
  mTokenAllocator = aTokenAllocator;
  mToken = aToken;
  IF_HOLD(mToken);
  mGenericState = PR_FALSE;
  mUseCount=0;
#ifdef HEAP_ALLOCATED_NODES
  mNodeAllocator = aNodeAllocator;
#endif
  return NS_OK;
}

void
nsCParserNode::AddAttribute(CToken* aToken) 
{
}


/**
 *  Gets the name of this node. Currently unused.
 *  
 *  @update  gess 3/25/98
 *  @param   
 *  @return  string ref containing node name
 */
const nsAString&
nsCParserNode::GetTagName() const {
  return EmptyString();
}


/**
 *  Get text value of this node, which translates into 
 *  getting the text value of the underlying token
 *  
 *  @update  gess 3/25/98
 *  @param   
 *  @return  string ref of text from internal token
 */
const nsAString& 
nsCParserNode::GetText() const 
{
  if (mToken) {
    return mToken->GetStringValue();
  }
  return EmptyString();
}

/**
 *  Get node type, meaning, get the tag type of the 
 *  underlying token
 *  
 *  @update  gess 3/25/98
 *  @param   
 *  @return  int value that represents tag type
 */
PRInt32 
nsCParserNode::GetNodeType(void) const
{
  return (mToken) ? mToken->GetTypeID() : 0;
}


/**
 *  Gets the token type, which corresponds to a value from
 *  eHTMLTokens_xxx.
 *  
 *  @update  gess 3/25/98
 *  @param   
 *  @return  
 */
PRInt32 
nsCParserNode::GetTokenType(void) const
{
  return (mToken) ? mToken->GetTokenType() : 0;
}


/**
 *  Retrieve the number of attributes on this node
 *  
 *  @update  gess 3/25/98
 *  @param   
 *  @return  int -- representing attribute count
 */
PRInt32 
nsCParserNode::GetAttributeCount(PRBool askToken) const
{
  return 0;
}

/**
 *  Retrieve the string rep of the attribute key at the
 *  given index.
 *  
 *  @update  gess 3/25/98
 *  @param   anIndex-- offset of attribute to retrieve
 *  @return  string rep of given attribute text key
 */
const nsAString&
nsCParserNode::GetKeyAt(PRUint32 anIndex) const 
{
  return EmptyString();
}


/**
 *  Retrieve the string rep of the attribute at given offset
 *  
 *  @update  gess 3/25/98
 *  @param   anIndex-- offset of attribute to retrieve
 *  @return  string rep of given attribute text value
 */
const nsAString&
nsCParserNode::GetValueAt(PRUint32 anIndex) const 
{
  return EmptyString();
}

PRInt32 
nsCParserNode::TranslateToUnicodeStr(nsString& aString) const
{
  if (eToken_entity == mToken->GetTokenType()) {
    return ((CEntityToken*)mToken)->TranslateToUnicodeStr(aString);
  }
  return -1;
}

/**
 * This getter retrieves the line number from the input source where
 * the token occured. Lines are interpreted as occuring between \n characters.
 * @update    gess7/24/98
 * @return  int containing the line number the token was found on
 */
PRInt32
nsCParserNode::GetSourceLineNumber(void) const {
  return mToken ? mToken->GetLineNumber() : 0;
}

/**
 * This method pop the attribute token
 * @update    harishd 03/25/99
 * @return  token at anIndex
 */

CToken* 
nsCParserNode::PopAttributeToken() {
  return 0;
}

/** Retrieve a string containing the tag and its attributes in "source" form
 * @update    rickg 06June2000
 * @return  void
 */
void 
nsCParserNode::GetSource(nsString& aString) 
{
  eHTMLTags theTag = mToken ? (eHTMLTags)mToken->GetTypeID() : eHTMLTag_unknown;
  aString.Assign(PRUnichar('<'));
  const PRUnichar* theTagName = nsHTMLTags::GetStringValue(theTag);
  if(theTagName) {
    aString.Append(theTagName);
  }
  aString.Append(PRUnichar('>'));
}

/** Release all the objects you're holding to.
 * @update    harishd 08/02/00
 * @return  void
 */
nsresult 
nsCParserNode::ReleaseAll() 
{
  if(mTokenAllocator) {
    IF_FREE(mToken,mTokenAllocator);
  }
  return NS_OK;
}

nsresult 
nsCParserStartNode::Init(CToken* aToken,
                         nsTokenAllocator* aTokenAllocator,
                         nsNodeAllocator* aNodeAllocator) 
{
  NS_ASSERTION(mAttributes.GetSize() == 0, "attributes not recycled!");
  return nsCParserNode::Init(aToken, aTokenAllocator, aNodeAllocator);
}

void nsCParserStartNode::AddAttribute(CToken* aToken) 
{
  NS_ASSERTION(0 != aToken, "Error: Token shouldn't be null!");
  mAttributes.Push(aToken);
}

PRInt32 
nsCParserStartNode::GetAttributeCount(PRBool askToken) const
{
  PRInt32 result = 0;
  if (askToken) {
    result = mToken ? mToken->GetAttributeCount() : 0;
  }
  else {
    result = mAttributes.GetSize();
  }
  return result;
}

const nsAString&
nsCParserStartNode::GetKeyAt(PRUint32 anIndex) const 
{
  if ((PRInt32)anIndex < mAttributes.GetSize()) {
    CAttributeToken* attr = 
      NS_STATIC_CAST(CAttributeToken*, mAttributes.ObjectAt(anIndex));
    if (attr) {
      return attr->GetKey();
    }
  }
  return EmptyString();
}

const nsAString&
nsCParserStartNode::GetValueAt(PRUint32 anIndex) const 
{
  if (PRInt32(anIndex) < mAttributes.GetSize()) {
    CAttributeToken* attr = 
      NS_STATIC_CAST(CAttributeToken*, mAttributes.ObjectAt(anIndex));
    if (attr) {
      return attr->GetValue();
    }
  }
  return EmptyString();
}

CToken* 
nsCParserStartNode::PopAttributeToken() 
{
  return NS_STATIC_CAST(CToken*, mAttributes.Pop());
}

void nsCParserStartNode::GetSource(nsString& aString) 
{
  aString.Assign(PRUnichar('<'));
  const PRUnichar* theTagName = 
    nsHTMLTags::GetStringValue(nsHTMLTag(mToken->GetTypeID()));
  if (theTagName) {
    aString.Append(theTagName);
  }
  PRInt32 index;
  PRInt32 size = mAttributes.GetSize();
  for (index = 0 ; index < size; ++index) {
    CAttributeToken *theToken = 
      NS_STATIC_CAST(CAttributeToken*, mAttributes.ObjectAt(index));
    if (theToken) {
      theToken->AppendSourceTo(aString);
      aString.Append(PRUnichar(' ')); //this will get removed...
    }
  }
  aString.Append(PRUnichar('>'));
}

nsresult nsCParserStartNode::ReleaseAll() 
{
  NS_ASSERTION(0!=mTokenAllocator, "Error: no token allocator");
  CToken* theAttrToken;
  while ((theAttrToken = NS_STATIC_CAST(CToken*, mAttributes.Pop()))) {
    IF_FREE(theAttrToken, mTokenAllocator);
  }
  nsCParserNode::ReleaseAll();
  return NS_OK; 
}


После рарсинга, например, остается:
Код

/** Release all the objects you're holding to.
 * @update    harishd 08/02/00
 * @return  void
 */


Помогите разобраться с регеспами. Пожалуйста. Код не мой - очень сложно понять, что имел в виду разработчик.
  Вверх
Ivan Kolesnikov
Дата 8.8.2005, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: 3
Всего: 6



Была найдена ошибка в строчке
Код

(?:'[^"\\]*(?:\\.[^'\\]*)*' [^"'/]*)+ # line in quotes (апостьроф)

Необходимо ее заменить на
Код

(?:'[^'\\]*(?:\\.[^'\\]*)*' [^"'/]*)+ # line in quotes (апостьроф)

--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.