미니 언어 포함을 지원하는 많은 프로그래밍 언어가 있습니다. PHP는 HTML 안에 내장되어 있습니다. XML은 JavaScript 내에 내장 될 수 있습니다. Linq는 C# 내에 임베드 될 수 있습니다. 정규식은 Perl에 내장 될 수 있습니다.합성 문법
// JavaScript example
var a = <node><child/></node>
대부분의 프로그래밍 언어는 다른 미니 언어로 모델링 할 수 있습니다. 자바는, 예를 들어, 적어도 네 가지의 미니 언어로 나눌 수 수 :
- 유형 선언의 langauge (패키지 지시, 수입 지시, 클래스 선언)
- 멤버 선언 언어 (액세스 한정자를, 메소드 선언, 회원은
- ) 할 수 있다는 진술 언어 (제어 흐름, 순차적 실행)
- 식 언어 (리터럴, 할당, 비교, 연산)
을 바르 네 가지 별개의 문법으로이 네 가지 개념 언어를 구현하는 것은 필자가 복잡한 파서 및 컴파일러 구현에서 일반적으로 볼 수있는 스파게티즘을 줄이기위한 것입니다.
(ANTLR, JavaCC 및 사용자 지정 반복적 파서를 사용하여) 이전에는 여러 가지 다른 종류의 언어에 대한 파서를 구현했으며 언어가 실제로 복잡해지면 하나의 huuuuuuge 문법으로 끝납니다. 파서 구현은 정말 못 생겼다.
이러한 언어 중 하나에 대한 파서를 작성하는 경우, 구문 분석기를 구성 가능한 파서의 모음으로 구현하고 이들 사이에서 제어를 앞뒤로 전달하는 것이 좋습니다.
까다로운 것은 종종 포함 된 언어 (예 : Perl)가 포함 된 언어 (예 : 정규식)에 대한 고유 한 종점 센티널을 정의한다는 것입니다. "|"
이 코드에서my $result ~= m|abc.*xyz|i;
는 메인 펄 코드는 비표준 말단을 정의 : 여기에 좋은 예입니다 정규 표현식의 경우. regex 파서를 perl 파서와 완전히 별개로 구현하는 것은 정말 어렵습니다. 정규 표현식 파서는 부모 파서와상의하지 않고 표현식 종단을 찾는 방법을 모르기 때문입니다.
또는 내가 Linq는 식의 포함을 허용 언어를 가졌으나 (C#을이처럼) 세미콜론 (;)으로 종료, 나는이 Linq에 표현식이 대괄호 안에 표시 의무화하고 싶었 말할 수 :
var linq_expression = [from n in numbers where n < 5 select n]
부모 언어 문법 내에서 Linq 문법을 정의한 경우 브릭 인클로저를 찾기 위해 구문 미리보기를 사용하여 "LinqExpression"에 대한 모호하지 않은 작업을 쉽게 작성할 수 있습니다. 하지만 부모님의 문법은 Linq 사양 전체를 흡수해야합니다. 그리고 그것은 끔찍합니다. 반면에 별도의 자식 Linq 파서는 외국 토큰 유형에 대한 미리보기를 구현해야하기 때문에 중단 할 위치를 파악하는 데 매우 어려움을 겪습니다.
Linq 파서가 부모 파서와 완전히 다른 토큰 화 규칙 세트를 정의하기 때문에 별도의 렉싱/파싱 단계를 사용하는 것이 거의 불가능합니다. 한 번에 하나의 토큰 만 스캔하는 경우 상위 언어의 어휘 분석기로 컨트롤을 다시 전달할시기를 어떻게 알 수 있습니까?
너희들은 어떻게 생각하니?더 큰 부모 langauges 안에 미니 언어를 포함시키기 위해 별개의 분리되고 구성 가능한 언어 문법을 구현하기 위해 오늘날 이용 가능한 최상의 기술은 무엇입니까?
OMeta이 있습니다! 여러 문법을 함께 구성하거나 OOP 스타일로 기존 문법을 상속 할 수 있습니다. – CMCDragonkai