내 언어를 구문 분석하기 위해 C#으로 파서를 만드는 가장 좋은 방법은 무엇입니까? 이상적으로는 문법을 제공하고 추상 구문 트리를 출력으로 제공하고자합니다. 많은 감사합니다. NestorC에서 파서를 작성하는 가장 빠르고 가장 빠른 방법 #
답변
나는 ANTLR v3과 함께 좋은 경험을했습니다. 가장 큰 이점은 무한한 미리보기를 가진 LL (*) 파서를 작성할 수 있다는 것입니다. 이들은 상당히 차선책 일 수 있지만 문법은 파서의 한계를 해결하기 위해 리팩터링 할 필요없이 가장 간단하고 자연스러운 방법으로 작성할 수 있습니다. 그리고 파서의 성능은 대개 큰 문제가 아닙니다 (저는 C++ 컴파일러를 쓰지 않기를 바랍니다). 특히 학습 프로젝트에서 그렇습니다.
또한 모든 코드를 작성할 필요없이 의미가있는 ASTs을 구성하는 꽤 좋은 방법을 제공합니다. 모든 문법 제작에 대해 "중요한"토큰 또는 하위 프로덕션을 나타내며 트리 노드가됩니다. 또는 나무 생산을 할 수 있습니다.
이 어떻게 보이는지의 요지를 얻기 위해 (복잡성이 증가하는 순서로 여기에 나열된) 다음과 같은 ANTLR 문법에서 살펴보고- JSON grammar 느낌 - 트리 제작과
- Lua grammar
- C grammar
Mono C# compiler의 소스 코드를 연구 할 수 있습니다.
감사합니다. 나는 C#을위한 파서를 쓰려고하는 것이 아니라, 내 자신의 언어를 파서로 쓰고 싶다. 파서는 C#으로 작성된다. 그래도 당신의 제안에 감사드립니다. – Nestor
렉스와 yacc는 여전히 내 즐겨 찾기입니다. 당신이 처음 시작하는 사람인지 모를 정도지만, 간단히 말하면 매우 간단하고 빠르며 쉽습니다.
원하는대로 만들 수 있습니다. C# 코드를 생성하고, 다른 문법을 작성하고, 지침을 에뮬레이트합니다.
귀엽지는 않지만 텍스트 기반 형식이며 LL1이므로 구문에 맞게 조정해야합니다.
더하기 측면에서, 그것은 어디 에나 있습니다. O'reilly에 대한 훌륭한 책, 많은 샘플 코드, 미리 만들어진 문법 및 많은 모국어 라이브러리가 있습니다.
여기 LL (1) 파서를 구성하는 데 짧은 용지 here이 있습니다. 물론 발전기도 사용할 수 있습니다.
고마워요! 좋은 제안 – Nestor
다시 감사합니다 파벨. 매우 유용한 포인터. – Nestor