추적 작업(함수 그래프 작성) - 페이지 5

 
jartmailru :
정적 코드 분석... 실행이 필요하지 않습니다.

텍스트 구문 분석이라는 다른 옵션에 대해 생각했습니다. MQL을 구문 분석하고 프로그램 구조를 생성한다고 가정해 보겠습니다.
그러나 나는 그것을 구현하는 방법조차 모릅니다. 연습이 없었다.

 
tara :

왜 안 돼요.

잘못된 구현 수단을 선택하는 것은 비전문성을 말합니다.
 
MetaDriver :

문제는 해결할 수 없는 문제가 아닙니까? 이런 식으로 산술 () [] 및 연산자 {} 대괄호 쌍을 제거하고 이를 여는 유일한 대괄호로 대체할 수 있습니다. 약한?

;)

왜.

결국 몇 가지 단항 연산이 있습니다.


jartmailru :
잘못된 구현 수단을 선택하는 것은 비전문성을 말합니다.

예, 무엇을 프로그래밍할지에 대한 차이점은 무엇입니까? 어쨌든 결정 매트릭스가 중요합니다.
다른 모든 것은 없다
 
jartmailru :
정적 코드 분석... 실행이 필요하지 않습니다.
코드는 기능(블록)으로 나뉩니다. 그런 다음 누가 누구를 호출하는지 분석됩니다.

저도 이런 생각이 듭니다. 산과 여드름을 분리하려면 전체 프로그램만 철저히 분석해야 합니다...

예, 그리고 토픽 스타터는 그것을 필요로 하지 않는 것 같습니다. 제가 올바르게 직관했다면 사실 이후에 호출을 인쇄해야 합니다. 통화 조건이 발생한 경우 입력합니다.

 
sergeev :

텍스트를 구문 분석하는 또 다른 옵션에 대해 생각했습니다. MQL을 구문 분석하고 프로그램 구조를 생성한다고 가정해 보겠습니다.
그러나 나는 그것을 구현하는 방법조차 모릅니다. 연습이 없었다.

초등학교.
기능이란 무엇입니까?
.
[ word space / this may not be ] 단어 함수 이름 괄호 "(", 무언가 있음, 닫는 괄호 ")"
곱슬 열기 {
.
일부 코드
중괄호를 {, } 쌍으로 고려하십시오.
.
중괄호 }
.
작업의 첫 번째 부분이 완료되었습니다.
 
sergeev :

:))

작업(첫 번째 게시물을 읽는 경우)은 "{" 바로 뒤에 소스 코드의 각 기능에 하나의 유틸리티 기능만 추가하는 것입니다.

그러나 소스 코드의 모든 패스를 가져오고 호출 트리를 구축하는 방식입니다.

동시에 원래 함수의 입력 매개변수도 결과도 내부 코드도



우리는 깨끗한 흔적에 대해 이야기하고 있지 않습니다. 그러나 함수의 그래프를 만드는 것에 대해서만.

다음은 로그 스니펫입니다.

 01 : 45 : 18 CTA0 USDCHF,H1: loaded successfully
01 : 45 : 18 CTA0 USDCHF,H1 inputs: BarsBeforeActivate= 1 ; BarsBeforeConfirm= 0 ; TraceIsAllowed= true ; IsStaticMode= false ; ClearAtFinish= true ; ExcludeFirstBar= false ; ExcludeLastBar= true ; RasingLinesColor=( 0 , 128 , 128 ); ReducingLinesColor=( 255 , 0 , 255 ); 
01 : 45 : 18 CTA0 USDCHF,H1: Init
01 : 45 : 18 CTA0 USDCHF,H1: Init=>NewBar(DeadLine)
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>InitType
01 : 45 : 18 CTA0 USDCHF,H1: Init=>DeleteGroup(Init)
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup=>ClearTrend
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup=>ClearTrend=>ClearTrace
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup(Empty)
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup(Empty)=>ClearTrend
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>ClearGroup(Empty)=>ClearTrend=>ClearTrace
01 : 45 : 18 CTA0 USDCHF,H1: Init=>LoadGroup(ClearScreen)=>SaveGroup(Empty)
01 : 45 : 18 CTA0 USDCHF,H1: Init=>PaintGroup(ClearScreen)
 
sergeev :

왜.

결국 몇 가지 단항 연산이 있습니다.

글쎄, 이 연산은 분명히 단항이 아니다. 정적 텍스트 분석의 "중첩 상태"는 단항입니다. 동적 추적 사용 - 바이너리. IN이 있고 EXIT가 있습니다.

아니다?

 
MetaDriver :

저도 이런 생각이 듭니다. 산과 여드름을 분리하려면 전체 프로그램만 철저히 분석해야 합니다...

예, 그리고 토픽 스타터는 그것을 필요로 하지 않는 것 같습니다. 제가 올바르게 직관했다면 사실 이후에 호출을 인쇄해야 합니다. 통화 조건이 발생한 경우 입력합니다.

구문 분석할 때 호출은 실제로 자체적으로 표시됩니다. 누가 누구와 어디에서 ...

따라서 현재로서는 이것이 유일한 완전한 솔루션 아이디어입니다.

 
"산"과 "여드름"처럼 "철저한" 파싱은 없습니다...
.
그건 그렇고 ... 추가하겠습니다 :
.
- 처음에 프로그램의 텍스트는 "lexer"에 의해 분석됩니다.
Lexer는 프로그램 텍스트를 "토큰"으로 만듭니다.
우리의 경우 토큰은 다음과 같습니다.
.
- 공백 - 공백, 탭, 줄 바꿈 등 -
우리는 포맷터를 작성하지 않기 때문에 이 항목을 무시합니다.
- 괄호( / )
- 괄호 [ / ]
- 괄호 { / }
- 연산자 + - / *
- 서비스 기호 ;,
다른 모든 것은 본질적으로 식별자입니다.
(숫자도 이 그룹에 포함되지만 상관하지 않습니다.)
.
렉싱을 파싱 할 때 다음과 같은 구조
구조체 { 유형 토큰, 문자열 토큰 }
.
구문 분석을 위해 다음과 같은 첨부 파일을 사용했습니다.
struct Token { typeToken, stringToken, list<Token> 중첩 토큰 목록 }
그러나 여기서는 더 간단하다고 생각할 수 있습니다.
.
그리고 위에서 말한 그룹화를 수행하는 것은 간단 합니다.
.
사실 렉서 + 파서의 조합은 장르의 고전이다.
나는 lex/flex/bison/ant-lr에 대해 상담하지 않을 것입니다 (나는 그런 이름조차 모릅니다 ;-D)-
직접 손으로 썼습니다.
 

확인. 토론에 대해 모두 감사합니다.

사유: