Показать сообщение отдельно
  #4  
Старый 03.10.2010, 02:14
yanot yanot вне форума
Прохожий
 
Регистрация: 03.10.2010
Сообщения: 7
Репутация: 12
По умолчанию

Почему бы не использовать Pos.
Не так и громоздко

Особо не тестировал, но вроде работает.

Тут нет проверки на обязательный закрывающий комментарий */
и на правильность кавычек


PHP код:
function Valid(LinesTStrings): boolean;

const
  
InnerArr: array[0..3of char = (
  
'{',
  
'[',
  
'(',
  
'<'
  
);

  
OuterArr: array[0..3of char = (
  
'}',
  
']',
  
')',
  
'>'
  
);

var
  
InnerCount: array[0..3of integer;
  
OuterCount: array[0..3of integer;
  
ijainteger;
  
Commentboolean;
  
CommentPosPos2integer;
  
Kavboolean// Кавычки
  
Startinteger;

begin

  
for := 0 to 3 do
  
begin
    InnerCount
[a] := 0;
    
OuterCount[a] := 0;
  
end;

  
Result := True;
  
Comment := False;

  for 
:= 0 to Lines.Count-do
  
begin
    
if Comment then
    begin
      CommentPos 
:= Pos('*/'Lines[i]);
      if 
CommentPos 0 then
        
Continue
      else
      
begin
        Comment 
:= False;
        
Start := CommentPos+2;
      
end;
    
end
    
else
      
Start := 1;

    
CommentPos := Pos('//'Lines[i]);
    
Pos2 := Pos('/*'Lines[i]);
    if (
Pos2 0) and ((CommentPos 0) or (Pos2 CommentPos)) then
    begin
      CommentPos 
:= pos2;
      
Comment := True;
    
end;

    if 
CommentPos Start then
      CommentPos 
:= LengthLines[i] );

    
Kav := False;
    for 
:= Start to CommentPos do
    
begin

      
if Lines[i][j] = '"' then
        Kav 
:= not Kav;

      if 
not Kav then
        
for := 0 to 3 do
        
begin
          
if Lines[i][j] = InnerArr[athen
            Inc
InnerCount[a] );

          if 
Lines[i][j] = OuterArr[athen
            
if InnerCount[a] > OuterCount[athen
              Inc
OuterCount[a] )
            else
              
Result := False;   // Ошибка: закрывающая скобка раньше открывающей
        
end;
    
end;

  
end;

  if 
Result then
    
for := 0 to 3 do
      if 
InnerCount[a] <> OuterCount[athen
      begin
        Result 
:= False;
        Break;
      
end;

end
Ответить с цитированием