2014-11-13 2 views
1

새로운 언어를 개발 중이며 전통적인 접근법 인 을 따르므로 lexer, 파서, ast 및 바이트 코드를 실행하는 가상 시스템이 있습니다.런타임에 내 언어를 확장합니다

파서가 +와 같은 연산자를 발견하면 ADD 가상 시스템 명령어를 생성하고 모든 것이 예상대로 작동합니다.

최종 사용자에게 언어를 확장하는 방법에 관심이 있습니다. 예를 들어 사용자가 자신의 후행 증가 연산자를 만들기 위해 연산자 ++ 함수를 추가 할 수 있습니다. 구문 분석기가 사용자가 추가 할 수있는 모든 연산자를 미리 알 수 없기 때문에 진행할 올바른 방법이 확실하지 않으므로 따라야 할 올바른 방법이 무엇인지 묻습니다.

+0

본질적으로 연산자 오버로딩은 연산자를 함수 호출로 바꾸지 만, 정확한 문제로 인해 새로운 연산자를 추가 할 수있는 언어는 거의 없습니다. "Kitchen sink included"철학으로 알려진 C++조차도 특정 기존 연산자에 과부하 만 허용하고 파싱 동작을 변경할 수 없습니다. – bcrist

+0

저는 모든 메소드가 연산자이고 그 반대 인 스칼라의 접근법을 매우 좋아합니다. – lmm

답변

1

당신은 그것을 스위프트 방법을 할 수있는 :

infix operator SomeToken { associativity left precedence 150 } 

이 SomeToken는 왼쪽 연관, 중위 될 것 스위프트 파서를 알려줍니다 스위프트에서

그것과 같은 문법 연산자 선언이 연산자는 우선 순위 기반 의사 결정에서이 연산자의 가중치는 150입니다. 다른 연산자는 더 높거나 낮거나 같은 우선 순위 메트릭을 가지며 파서가 AST를 만들 때 안내자가됩니다

0

예를 들어 C# 오버로드 할 수있는 연산자 목록은 미리 알려져 있으며 과부하는 항상 특수 키워드 operator을 사용하여 표시되므로 사용자가 연산자를 "추가하는"것으로 파서에 이미 알려져 있습니다.
프롤로그 새로운 사업자에 예를 들어

http://msdn.microsoft.com/en-us/library/aa691324(v=vs.71).aspx을 확인하고 자신의 평가 우선 순위는 온 - 더 - 즉석 op(Precedence,Type,Name) 지시어를 사용하여 언어를 추가 할 수 있습니다. Prolog 파서는 입력을 읽고 라인별로 평가합니다. 각 "라인은"언어 무한히 확장을 할 http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse40

0

한 가지 방법을 참조하십시오 .
종료 커먼 리스프 또는 넷째처럼, 전체, 재귀 메타 프로그래밍을 할 수 있도록이다. 이 방법을 통해 사용자는 기존의 모든 핵심 확장을 포함하여 이미 사용 가능한 모든 언어를 재사용하여 기존의 핵심 언어에 추가 변환을 구현할 수 있습니다.

구문을 확장 할 수 있기를 원한다면 어휘를 제거하고 대신 강력한 lexerless 구문 분석 방법, 즉 PEGs을 사용할 수 있습니다. 일부 언어는 이미이 작업을 수행하고 있습니다 (Katahdin, pfront, CLike).

관련 문제