PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Надёжная регулярка удаления комментария из PB кода


Надёжная регулярка удаления комментария из PB кода

Сообщений 1 страница 7 из 7

1

Ребят, подсобите с надёжной регуляркой.
Нужна такая, которая получая свой собственный код, не будет отрезать лишнее, а только лишь реальный комментарий. Следующий код вроде работает, но, всему этому, хотел бы найти регулярку:

Код:
; тестовые строки:
CreateRegularExpression( #PB_Any, ";.*?$" ) ; Комментaрий ";';"";'';" ;""; ;"""; ;'; ;''; ;'''; ;; ;;; q
CreateRegularExpression( #PB_Any, "^((?:[^"+#DQUOTE$+";~]*"+#DQUOTE$+"[^"+#DQUOTE$+"]*?"+#DQUOTE$+")*[^;~]*)\h*;.*?(?=\r?$)" ) ; Комментaрий
;

Procedure.s DelComment(Line$) ; Комментaрий
  Protected New$ = "", i, Quote.a = #False ; Комментaрий
  For i = 1 To Len(Line$) ; Комментaрий
    Protected Char$ = Mid( Line$, i, 1 ) ; Комментaрий
    If Char$ = #DQUOTE$ ; Комментaрий
      If Not Quote : Quote = #True : Else : Quote = #False : EndIf ; Комментaрий
    ElseIf Char$ = ";" And Not Quote ; Комментaрий
      Break ; Комментaрий
    EndIf ; Комментaрий
    New$ + Char$ ; Комментaрий
  Next  ; Комментaрий
  ProcedureReturn New$ ; Комментaрий
EndProcedure

If ReadFile(0, #PB_Compiler_File) ; Комментaрий
  Define Format = ReadStringFormat(0) ; отрезаем BOM, если есть
  While Eof(0) = 0
    Debug DelComment( ReadString(0,Format) ) ; Комментaрий
  Wend ; Комментaрий
  CloseFile(0) ; Комментaрий
Else ; Комментaрий
    MessageRequester("Инфо", "Невозможно открыть файл!") ; Комментaрий
EndIf; Комментaрий

Отредактировано Webarion (30.12.2023 00:57:21)

0

2

Я выкладывал на оффоруме, но в итоге перешел на родной анализатор кода, исходник тоже выкладывал. Анализатор идеально определяет лексемы кода, так как он же и подсвечивает код и 100℅ не ошибется. Инструмент есть в моей сборке.

0

3

AZJIO написал(а):

Я выкладывал на оффоруме, но в итоге перешел на родной анализатор кода, исходник тоже выкладывал. Анализатор идеально определяет лексемы кода, так как он же и подсвечивает код и 100℅ не ошибется. Инструмент есть в моей сборке.

Поделись пожалуйста ссылками, а то так непонятно.
Я обновил свой пример из первого сообщения, во второй строке использовал твой шаблон из RegExpPB.
Если непосредственно применять регулярку, то она не работает, код отрезается.

0

4

[IDE tool] remove comments in code
регулярное выражение

0

5

Всё-таки у меня получилось создать надёжную регулярку. Пример:

Код:
; Удаление комментариев в PureBasic коде с помощью регулярного выражения (файл читается построчно и регулярка также работает построчно)
; Автор Webarion

; Строки для теста:
#Q$ = #DQUOTE$
CreateRegularExpression( #PB_Any, ";.*?$" ) ; Комментaрий
CreateRegularExpression( #PB_Any, "^((?:[^"+#Q$+";~]*"+#Q$+"[^"+#Q$+"]*?"+#Q$+")*[^;~]*)\h*;.*?(?=\r?$)" ) ; Комментaрий ; "q" ~"w" ; e
CreateRegularExpression( #PB_Any, "^(.*?(?:~"+#Q$+".*?[^\\]"+#Q$+".*?|"+#Q$+".*?"+#Q$+".*?)*)\h*(?:;.*)?$" ) ; Комментaрий
CreateRegularExpression( #PB_Any, "\G(.*?(?:~\"+#Q$+".*?[^\\]\"+#Q$+".*?|\"+#Q$+".*?\"+#Q$+".*?)*)\h*(?:;.*)?(?:\r\n|\r|\n)" ) ; Комментaрий
Define Var$ = ~" Var$+\";q;\"+';w;'+\";e;';r;\"+\";t;';y;';u;\"+'i;o\"p;a\"s;d'+f" ; Комментaрий
Var$ = " Var$+\" ; Комментaрий q;\"+';w;'+\";e;';r;\"+\";t;';y;';u;\"+'i;o\"p;a\"s;d'+f"
Var$ = ~";q;\""+"w" ; Комментaрий
Var$ = ~"q" + Str('q') + "w" + ~"e\"" + "r" + "t" + ~";" + "" + ~"\";\"" ; Комментaрий
; конец тестовых строк


#RegExp_RemoveLineComment = 0 ; Регулярка для строки: ^(.*?(?:~".*?[^\\]".*?|".*?".*?)*)\h*(?:;.*)?$
CreateRegularExpression( #RegExp_RemoveLineComment, ~"^(.*?(?:~\".*?[^\\\\]\".*?|\".*?\".*?)*)\\h*(?:;.*)?$" ) ; Комментaрий

Procedure.s RemoveLineComment(Line$) ; Комментaрий
  If IsRegularExpression(#RegExp_RemoveLineComment) ; Комментaрий
    If ExamineRegularExpression(#RegExp_RemoveLineComment, Line$) And NextRegularExpressionMatch(#RegExp_RemoveLineComment) ; Комментaрий
      ProcedureReturn RegularExpressionGroup(#RegExp_RemoveLineComment, 1) ; Комментaрий
    EndIf ; Комментaрий
  Else ; Комментaрий
    Debug RegularExpressionError() ; Комментaрий
  EndIf ; Комментaрий
  ProcedureReturn "" ; Комментaрий
EndProcedure


If ReadFile(0, #PB_Compiler_File) ; Комментaрий
  Define Format = ReadStringFormat(0) ; отрезаем BOM, если есть
  While Eof(0) = 0
    Debug RemoveLineComment( ReadString(0, Format) ) ; Комментaрий
  Wend ; Комментaрий
  CloseFile(0) ; Комментaрий
Else ; Комментaрий
  MessageRequester( "Инфо", "Невозможно открыть файл " + #PB_Compiler_File ) ; Комментaрий
EndIf   

Отредактировано Webarion (01.01.2024 04:12:06)

0

6

Пример, обрабатывающий сразу весь код:

Код:
; Удаление комментариев в PureBasic коде с помощью регулярного выражения (файл читается целиком и регулярка работает со всем текстом)
; Автор Webarion

; Строки для теста:
#Q$ = #DQUOTE$
CreateRegularExpression( #PB_Any, ";.*?$" ) ; Комментaрий
CreateRegularExpression( #PB_Any, "^((?:[^"+#Q$+";~]*"+#Q$+"[^"+#Q$+"]*?"+#Q$+")*[^;~]*)\h*;.*?(?=\r?$)" ) ; Комментaрий ; "q" ~"w" ; e
CreateRegularExpression( #PB_Any, "^(.*?(?:~"+#Q$+".*?[^\\]"+#Q$+".*?|"+#Q$+".*?"+#Q$+".*?)*)\h*(?:;.*)?$" ) ; Комментaрий
CreateRegularExpression( #PB_Any, "(?m)\G(.*?(?:~\"+#Q$+".*?[^\\]"+#Q$+".*?|"+#Q$+".*?"+#Q$+".*?)*)\h*(?:;.*)?(\r\n|\r|\n|\z)" ) ; Комментaрий
Define Var$ = ~" Var$+\";q;\"+';w;'+\";e;';r;\"+\";t;';y;';u;\"+'i;o\"p;a\"s;d'+f" ; Комментaрий
Var$ = " Var$+\" ; Комментaрий q;\"+';w;'+\";e;';r;\"+\";t;';y;';u;\"+'i;o\"p;a\"s;d'+f"
Var$ = ~";q;\""+"w" ; Комментaрий
Var$ = ~"q" + Str('q') + "w" + ~"e\"" + "r" + "t" + ~";" + "" + ~"\";\"" ; Комментaрий
; конец тестовых строк


#RegExp_RemoveCommentsPBCode = 0 ; Регулярка для всего кода: (?m)\G(.*?(?:~\".*?[^\\]".*?|".*?".*?)*)\h*(?:;.*)?(\r\n|\r|\n|\z)
CreateRegularExpression( #RegExp_RemoveCommentsPBCode, ~"(?m)\\G(.*?(?:~\".*?[^\\\\]\".*?|\".*?\".*?)*)\\h*(?:;.*)?(\\r\\n|\\n|\\r|\\z)" ) ; Комментaрий

Procedure.s RemoveCommentsPBCode(PBCode$) ; Комментaрий
  If IsRegularExpression(#RegExp_RemoveCommentsPBCode) ; Комментaрий
    If ExamineRegularExpression(#RegExp_RemoveCommentsPBCode, PBCode$) 
      Protected PBCcodeCommentsRemoved$ = ""
      While NextRegularExpressionMatch(#RegExp_RemoveCommentsPBCode) ; Комментaрий
        ; заменяем на код без комментария + перенос строки, который существует в файле
        PBCcodeCommentsRemoved$ + RegularExpressionGroup(#RegExp_RemoveCommentsPBCode, 1) + RegularExpressionGroup(#RegExp_RemoveCommentsPBCode, 2) ; Комментaрий
      Wend
      ProcedureReturn PBCcodeCommentsRemoved$
    EndIf ; Комментaрий
  Else ; Комментaрий
    Debug RegularExpressionError() ; Комментaрий
  EndIf ; Комментaрий
  ProcedureReturn "" ; Комментaрий
EndProcedure


If ReadFile(0, #PB_Compiler_File) ; Комментaрий
  Define Format = ReadStringFormat(0) ; отрезаем BOM, если есть
   Debug RemoveCommentsPBCode( ReadString( 0, Format | #PB_File_IgnoreEOL ) )
  CloseFile(0) ; Комментaрий
Else ; Комментaрий
  MessageRequester( "Инфо", "Невозможно открыть файл " + #PB_Compiler_File ) ; Комментaрий
EndIf  

0

7

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

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Надёжная регулярка удаления комментария из PB кода