저는 컴파일러에 대한 연구를 해왔습니다. 렉서는 매우 직설적 인 것처럼 보입니다. "문장"을 가지고 단어 (또는 토큰)로 나눕니다. 올바른 문법을 보장하려면 파서가 필요합니다. 파서는 일반적으로 토큰을 가져 와서 루트 노드 (문장, 단락, 페이지 등의 단어)를 생성하는 트리를 만듭니다.추상 또는 구체적인 구문 트리를 사용하는 경우는 언제입니까?
this question에서 파서가 AST를 작성하는 것처럼 보일 수 있습니다. AST에는 코드를 실행하는 데 필요한 것이 포함되어 있으므로 연산자 우선 순위가 AST에 내장되어 있으므로 괄호와 같은 요소는 필요하지 않습니다. AST는 아마도 모든 컴파일러가 필요합니다.
그러나 한 언어에서 다른 언어로 코드를 변환하는 것은 어떨까요? 구성된 언어 (문법) 또는 기존 문법을 사용하고 연산자 우선 순위 규칙이 다를 수도 있고 다를 수도있는 다른 언어로 변환 할 수 있습니까? CST에도 연산자 우선 순위가 "내장"되어 있습니까?
예를 들어 내가 언어를 구성하고이를 PHP 코드로 변환하려고한다고 가정 해 보겠습니다. 대부분의 언어에서 삼항 연산자는 오른쪽에서 왼쪽으로 연결됩니다. PHP는 left-to-right 연관성 (see more about this here)을 잘못 사용합니다. "내 언어"가 오른쪽에서 왼쪽으로 쓰길 원하지만 결과 PHP 코드는 괄호를 적용하여 PHP에서 올바른 결과를 얻을 수 있습니다 (link to Wikipedia, 결과는 "말"대신 "열차"가되어야 함).
그래서 언어 변환에 CST가 더 좋을까요? 일반적으로 운영자 우선 순위는 CST에 내장됩니까? 그 사이에 어떤 것이 있습니까? 두 대수를 간단한 대수 방정식과 비교하는 예제가 있습니까? 삼항 연산자를 보여주는 예제가 있습니까? 경우가 더 적절한 하나를 사용 :
는내가 알아 내려고 노력하고있어입니다 (?. "트랜스" "프로그래밍 언어 번역"에 대한 올바른 용어 구글 검색 미디어 변환납니다입니다) 다른 것보다?
언어 - 언어 변환을 위해 구체적인 구문 트리가 필요한 이유가 없습니다. 구체적인 구문은 정확하게 다를 가능성이 가장 큰 것입니다. 다른 언어로 유사한 * 의미론 *을 가진 프로그램을 만들고 싶습니다. 원래 프로그램의 의미론 만 필요하기 때문에 AST는 덜 혼란스럽게 만듭니다. – delnan
아, 무슨 뜻인지 알 겠어. 그래서 언제 구체적인 나무를 사용하고 더 추상적 인 나무보다 적절하다고 간주하고 구체적인 나무가 우선 순위에 대해 신경을 쓰나요? – Luke