루프 또는 분기 문없이 PHP 스크립트 실행

Aayush

모든 루핑 문과 분기 문을 제거하고 다른 문을 실행할 수있는 PHP 파서

PHP 코드 예 :-

입력

<?php
if(1){
echo "hello";
}
while(1){
echo "world";
}

산출

<?php
echo "hello";
echo "world";
Ira Baxter

이것은 완전한 언어 파서 없이는 매우 어렵습니다.

프로그램 변환 시스템 (PTS)으로 이를 수행 할 수 있습니다 . 이들은 소스 코드를 컴파일러 데이터 구조 (종종 추상 구문 트리 [AST])로 구문 분석하고 AST를 변경 한 다음 수정 된 컴파일러 데이터 구조에서 유효한 소스 텍스트를 다시 생성 할 수있는 도구입니다.

약한 PTS는 컴파일러가 수행하는 고전적인 방식으로 절차 적으로 트리를 걷거나 / 검사 / 변경할 수 있도록합니다. 이 접근 방식을 사용하면 데이터 구조에 대해 잘 알고 있어야합니다 (예 : 트리의 정확한 구조를 알아야 함). 실제 언어의 경우 알고 있어야 할 세부 사항이 많이 있습니다. 열정이 많으면 효과가 있습니다.

좋은 PTS를 사용하면 트리를 검색 / 변경하는 데 사용할 소스-소스 변환을 제공 할 수 있습니다. 이러한 재 작성은 다음과 같습니다.

  when you see *thispattern*, replace it by *thatpattern*, if *condition*

여기서 thispatternthatpattern 은 변환되는 소스 언어로 작성된 패턴입니다. PTS는 그것들을 상응하는 컴파일러 데이터 구조로 변환하는 것을 처리하므로 훨씬 적은 지식으로 얻을 수 있습니다.

OP의 경우 그는 PHP를 구문 분석하고 변환 할 수있는 PTS가 필요합니다.

내가 아는 유일한 "좋은"PTS PHP 프론트 엔드 가있는 DMS 소프트웨어 리엔지니어링 툴킷 입니다 .

짧은 DMS 메타 프로그램을 작성하여 파일을 열고 읽고, 변환을 가져 와서 적용한 다음 결과를 예쁘게 인쇄해야합니다 (명확성을 위해 약간 단순화).

 (define main
    (action (procedure void)
        (= AST  (Registry:Parse PHPDomain `my_file.php'))
        (Registry:ApplyTransforms AST (. `my_rewrite_rules.rsl') (. `strip_control_flow'))
        (local (= [os OutputStream:Stream] (OutputSteam:Open `updated_my_file.php'))=
               (Registry:PrettyPrint os PHPDomain AST))
               (= os (OutputStream:Close os))
        )local
    )action
  )define

대부분의 작업은 "my_rewrite_rules.rsl"파일의 DMS 재 작성 규칙에 의해 수행됩니다.

 domain PHP~PHP5.

 rule strip if_then(c: expression, s: statement):
     statement -> statement =
 " if (\c) \s" ->  "\s".

 rule strip if_then_else(c: expression, s1: statement, s2: statement):
     statement -> statement =
 " if (\c) \s1 else \s2" -> " { \s1 \s2 } ".

 rule strip while(c: expression, s: statement):
     statement -> statement =
 " while (\c) \s" ->  "\s".

 rule strip catch( b1: statements, l: catch_clauses, t: type, e: expression, b2: statements):
     statement -> statement =
 " try { \b1 } \l catch ( \t \e ) { \b2 } "
 -> " { try { \b1 } \l ; \b2 } ".

 rule strip_trivial_try( b1: statements):
     statement -> statement =
 " try { \b1 } " -> "{ \b1 }".

 rule strip_useless_block( b:statements, s: statements):
    statements -> statements =
 "  { \b } \s " ->  " \b \s ".

 ruleset strip_control_flow = {
     strip_if_then,
     strip_if_then_else,
     strip_while,
     strip_catch,
     strip_trivial_try,
     strip_useless_block }

등. 모든 사례를 다루지는 않았지만 진행 방법이 분명해야합니다.

위의 설명 : DMS 다시 쓰기 규칙은 다음과 같은 형식을 취합니다.

   rule rulename ( pattern_variable_declarations):
       syntaxcategory -> syntaxcategory
   "thispattern" -> "thatpattern".

thispatternthatpattern재 작성 규칙 언어 자체의 구문과 소스 프로그램 패턴 텍스트를 구별하는 메타 따옴표 "..." 안에 작성됩니다. 메타 따옴표 를 사용하면 패턴 변수 선언에서 구문 범주가 x : 범주 로 선언 된 패턴 변수 \ x 와 혼합 된 소스 언어 텍스트를 찾습니다 . 언어의 주요 구문 범주 (예 : "문"대 "문"대 "표현식")를 알아야하지만 while 루프의 모든 내부 구조에 대해서는 알지 못합니다.

규칙 집합 그룹을 일괄 적으로 적용 할 수있는 편리한 번들로 명명 규칙을 흥미의 세트; 이 규칙 세트가 DMS 메타 프로그램에서 어떻게 언급되는지 볼 수 있습니다.

이 규칙 세트를 작성할 때 사용되는 트릭은 각 규칙이 제어 된 콘텐츠 요소를 블록 {...}로 제거하는 것입니다. 블록은 문으로 허용되기 때문입니다. 정리 규칙 strip_useless_blocks는 생성 된 모든 심각한 블록을 제거합니다.

여기에서 DMS 다시 쓰기 규칙이 작성되는 방법에 대해 자세히 알아볼 수 있습니다 .

이러한 재 작성 규칙은 후속 단계를 통해 OP의 프로그램을 점진적으로 변환합니다 (각 변환 후 전체 AST를 예쁘게 인쇄하여이를 확인할 수 있음).

스타트:

<?php
if(1){
echo "hello";
}
while(1){
echo "world";
}

strip_if_then 이후 :

<?php
{
echo "hello";
}
while(1){
echo "world";
}

strip_while 이후 :

<?php
{
echo "hello";
}
{
echo "world";
}

strip_useless_block의 첫 번째 적용 후 :

<?php
echo "hello";
{
echo "world";
}

strip_useless_block의 두 번째 적용 후 :

<?php
echo "hello";
echo "world";

그리고 우리는 OP가 원하는 결과를 얻었습니다. 이것은 큰 파일에서 훨씬 더 훌륭합니다.

따라서 OP의 작업은 좋은 PTS로 수행하기가 매우 쉽습니다.

나는 누군가가 이와 같이 제어 흐름을 제거하기를 원하는 이유에 대한 단서가 없다는 것을 인정할 것입니다. 그러나 PTS의 요점은 직접 수행하기 어려운 임의의 코드 변경 작업을 수행하도록 구성 할 수 있다는 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

cronjob없이 30 분마다 PHP 스크립트를 실행하는 방법

분류에서Dev

for 루프의 if 문이 Java 스크립트에서 실행되지 않는 이유

분류에서Dev

파이썬 스크립트를 실행하는 프로세스 소스 찾기

분류에서Dev

XMLHttpRequest PHP 스크립트가 실행되는 동안 데이터 가져 오기

분류에서Dev

crontab없이 PHP 스크립트 실행

분류에서Dev

플러그에서 마이크를 루프백하는 스크립트를 실행하기위한 udev 규칙 생성 문제

분류에서Dev

16.04에서 5 분마다 PHP 스크립트 실행 문제

분류에서Dev

'x'분마다 jquery 스크립트를 실행하는 PHP

분류에서Dev

자바 스크립트에서 비동기 실행 실행을 제어하는 솔루션이 있습니까?

분류에서Dev

루비 스크립트를 실행하기위한 bash for 루프

분류에서Dev

for 루프에서 PHP 스크립트를 여러 번 실행

분류에서Dev

루비 스크립트는 실행하기 힘들다

분류에서Dev

PHP 스크립트 실행시 JSON 데이터 구문 분석 오류

분류에서Dev

SQL 값이 존재하는 경우 PHP while 루프는 변수에 1을 추가하고 스크립트를 실행합니다.

분류에서Dev

Bash for 루프에는 루비 스크립트에서 실행할 때만 구문 오류가 있습니다.

분류에서Dev

Swift 3 스크립트는 MySQL 데이터베이스에 데이터를 삽입하기 위해 PHP 스크립트를 실행하지 않습니다.

분류에서Dev

자바 스크립트 루프 실행, 비동기 결과

분류에서Dev

장기 실행 while 루프로 쉘 스크립트 최적화

분류에서Dev

장기 실행 while 루프로 쉘 스크립트 최적화

분류에서Dev

자바 스크립트 루프에서 함수 실행 문제

분류에서Dev

루프에서 bash 스크립트를 실행하는 방법

분류에서Dev

스크립트는 한 번만 루프를 실행합니다.

분류에서Dev

둘 이상의 프로세서를 사용하여 PHP 스크립트를 실행하는 방법

분류에서Dev

쉘 스크립트에서 여러 파일의 이름을 바꾸기 위해 for 루프를 실행하는 동안 오류가 발생했습니다.

분류에서Dev

자바 스크립트의 다른 루프에있는 메인 게임 루프에서 자주 실행할 필요가없는 코드를 분리하는 것이 더 효율적입니까?

분류에서Dev

tkinter 또는 스레드 모듈없이 두 개의 while 루프 실행

분류에서Dev

for 루프가 자바 스크립트에서 함수가 실행될 때까지 기다리는 방법

분류에서Dev

PHP는 자바 스크립트 변수 또는 배열로 구문 분석

분류에서Dev

이 자바 스크립트 for 루프가 한 번만 실행되는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    cronjob없이 30 분마다 PHP 스크립트를 실행하는 방법

  2. 2

    for 루프의 if 문이 Java 스크립트에서 실행되지 않는 이유

  3. 3

    파이썬 스크립트를 실행하는 프로세스 소스 찾기

  4. 4

    XMLHttpRequest PHP 스크립트가 실행되는 동안 데이터 가져 오기

  5. 5

    crontab없이 PHP 스크립트 실행

  6. 6

    플러그에서 마이크를 루프백하는 스크립트를 실행하기위한 udev 규칙 생성 문제

  7. 7

    16.04에서 5 분마다 PHP 스크립트 실행 문제

  8. 8

    'x'분마다 jquery 스크립트를 실행하는 PHP

  9. 9

    자바 스크립트에서 비동기 실행 실행을 제어하는 솔루션이 있습니까?

  10. 10

    루비 스크립트를 실행하기위한 bash for 루프

  11. 11

    for 루프에서 PHP 스크립트를 여러 번 실행

  12. 12

    루비 스크립트는 실행하기 힘들다

  13. 13

    PHP 스크립트 실행시 JSON 데이터 구문 분석 오류

  14. 14

    SQL 값이 존재하는 경우 PHP while 루프는 변수에 1을 추가하고 스크립트를 실행합니다.

  15. 15

    Bash for 루프에는 루비 스크립트에서 실행할 때만 구문 오류가 있습니다.

  16. 16

    Swift 3 스크립트는 MySQL 데이터베이스에 데이터를 삽입하기 위해 PHP 스크립트를 실행하지 않습니다.

  17. 17

    자바 스크립트 루프 실행, 비동기 결과

  18. 18

    장기 실행 while 루프로 쉘 스크립트 최적화

  19. 19

    장기 실행 while 루프로 쉘 스크립트 최적화

  20. 20

    자바 스크립트 루프에서 함수 실행 문제

  21. 21

    루프에서 bash 스크립트를 실행하는 방법

  22. 22

    스크립트는 한 번만 루프를 실행합니다.

  23. 23

    둘 이상의 프로세서를 사용하여 PHP 스크립트를 실행하는 방법

  24. 24

    쉘 스크립트에서 여러 파일의 이름을 바꾸기 위해 for 루프를 실행하는 동안 오류가 발생했습니다.

  25. 25

    자바 스크립트의 다른 루프에있는 메인 게임 루프에서 자주 실행할 필요가없는 코드를 분리하는 것이 더 효율적입니까?

  26. 26

    tkinter 또는 스레드 모듈없이 두 개의 while 루프 실행

  27. 27

    for 루프가 자바 스크립트에서 함수가 실행될 때까지 기다리는 방법

  28. 28

    PHP는 자바 스크립트 변수 또는 배열로 구문 분석

  29. 29

    이 자바 스크립트 for 루프가 한 번만 실행되는 이유는 무엇입니까?

뜨겁다태그

보관