문제

나는 Infix, postfix, prefix 또는 여러 단어로 구성된 함수의 정의를 허용함으로써 DSL의 생성에 매우 적합한 언어를 만드는 것에 대해 괴롭 혔습니다. 예를 들어, 디스크 곱셈 연산자를 다음과 같이 정의 할 수 있습니다 (곱하기 (x, y)가 이미 정의 된 경우).

a * b => multiply(a,b)

또는 포스트 픽스 "제곱"연산자 :

a squared => a * a

또는 변수가 산재 된 두 개의 키워드가 포함 된 C 또는 Java 스타일의 3 차 연산자.

a ? b : c => if a==true then b else c

분명히 그러한 언어로는 모호성에 대한 많은 범위가 있지만 정적으로 입력 한 경우 (유형 추론 포함) 대부분의 모호성을 제거 할 수 있으며, 남아있는 것은 구문 오류로 간주 될 수 있습니다 (브래킷을 추가하여 수정 될 것입니다. 적절한).

내가 이것을 매우 어렵고 불가능하거나 단지 나쁜 생각으로 만드는 이유가 있습니까?

편집하다: 많은 사람들이 이것이나 이와 같은 일을 할 수있는 언어를 지적했지만, 실제로 나는 그것을 위해 내 파서를 구현할 수있는 방법에 관심이 있거나 그렇게하면 문제가 발생할 수있는 문제에 관심이 있습니다.

도움이 되었습니까?

해결책

이것은 너무 어렵지 않습니다. 각 연산자를 할당하고 싶을 것입니다 정착 (Infix, Prefix 또는 Postfix) 및 상위. 우선 순위를 실수로 만드십시오. 나중에 감사합니다. 우선 순위가 높은 연산자는 우선 순위가 낮은 연산자보다 더 단단히 결합합니다. 동일한 수준의 우선 순위에서 괄호와의 분해가 필요할 수 있지만 일부 운영자가 연관성 그래서 당신은 쓸 수 있습니다

x + y + z

괄호없이. 각 연산자에 대한 고정성, 우선 순위 및 연관성이 있으면 운영자-예비 파서. 이런 종류의 파서는 간단하게 글을 쓰는 것입니다. 왼쪽에서 오른쪽으로 토큰을 스캔하고 하나의 보조 스택을 사용합니다. 드래곤 북에는 설명이 있지만 드래곤 북은 운영자-예비 구문 분석의 일반적인 사례를 설명하기 때문에 부분적으로는 분명하다는 것을 알지 못했습니다. 그러나 나는 당신이 그것이 어렵다는 것을 알지 못한다고 생각합니다.

조심하고 싶은 또 다른 사례는

prefix (e) postfix

어디 prefix 그리고 postfix 같은 우선 순위가 있습니다. 이 사례는 또한 명확한 괄호가 필요합니다.

내 논문 접두사 및 포스트 픽스 연산자를 사용한 표현이없는 표현 뒷면에 Parser가 있으며 코드를 다운로드 할 수 있지만 ML로 작성되어있어서 아마추어에게는 그 작업이 분명하지 않을 수 있습니다. 그러나 고정의 전체 사업 등은 자세히 설명되어 있습니다.

다른 팁

운영 순서에 대해 무엇을 하시겠습니까?

a * b squared

연산자와 방법에 대한 독특한 접근 방식이있는 Scala를 확인할 수 있습니다.

Haskell 당신이 찾고있는 것을 가지고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top