최근에 스택 기반 프로그래밍 언어를 작성하는 작업을 수행했습니다. 그러나 언어 디자인을 시작하기 전에 기존 스택 기반 언어를 읽고 실험 해 보는 것이 좋습니다.
이것은이 게시물의 주제로 연결됩니다. Postfix 스타일 표현식을 사용하는 스택 기반 언어 인 Forth에 대한 Wikipedia 기사를 읽고있었습니다 . 이 기사에서는 다음과 같은 진술을 보았습니다.
Forth의 유연성은 정적 BNF 문법을 부적절하게 만들며 모 놀리 식 컴파일러는 없습니다. 컴파일러를 확장하려면 문법을 수정하고 기본 구현을 변경하는 대신 새 단어를 작성하면됩니다.
Forth lingo에서 "word"라는 용어는 기본적으로 "subroutine"과 동의어로 보입니다. 이것을 감안할 때 위의 진술은 이상하게 보입니다. Forth에서 새로운 기능을 만드는 기능이 Forth의 공식 문법을 부적절하게 만드는 이유는 무엇입니까? 정의한 새로운 서브 루틴마다 문법을 다시 작성해야하는 이유는 무엇입니까? 환경에서 새 단어를 작성 하면 컴파일러 확장 이 어떻게 구성 됩니까? 위의 문장은 새로운 함수를 정의 할 수 있기 때문에 공식 문법이 파이썬에 적합하지 않다고 말하는 것과 비슷합니다.
실제로, 나는 아래 Forth의 간단한 부분 집합에 대한 BNF 스타일 문법을 작성하기로 결정했습니다.
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
위의 문법은 Forth 문장의 유효한 부분 집합을 다루는 것처럼 보이며, Forth 언어로 된 모든 유효한 문장을 다루기 위해 확장되는 것은 아닙니다. 또한 컴파일러의 파서가 위의 문법을 구현하면 컴파일러가 어떻게 확장되는지 알 수 없습니다. 컴파일러는 단순히 환경에 새로운 단어를 추가 합니다 . 환경 만 바뀝니다. 위의 Wikipedia에서 발췌 한 내용은 컴파일러를 구성하는 밑줄 코드를 변경하지 않는 컴파일러 환경 과 변경하는 것처럼 보입니다 .
요약하면, 새로운 단어 (서브 루틴)를 정의하는 Forth의 ablitiy가 왜 문법에 적합하지 않습니까?