2011-03-04 3 views
6

VBScript 파서를 만들려고합니다. 나는 그것에 대해 갈 가장 좋은 방법이 무엇인지 궁금 해서요. 나는 연구하고 연구했다. 가장 인기있는 방법은 Gold Parser 또는 ANTLR과 같은 것입니다.VBScript 부분 구문 분석기

구현하려는 기능은 VBScript에서 구문 오류의 동적 검사를 수행하는 것입니다. 일부 텍스트가 바뀔 때마다 전체 VBS를 컴파일하고 싶지 않습니다. 어떻게해야합니까? 나는 Gold Parser를 사용하려고 시도했으나 부분 구문 분석 트리와 같은 구문 분석을 수행하는 점진적인 방법이 없다고 가정합니다. 이러한 시나리오에 대해 부분 구문 분석 트리를 구현하는 방법에 대한 아이디어는 무엇입니까?

나는 GOLD Parser를 통해 VBscript 구문 분석을 구현했습니다. 그러나 여전히 부분 파서가 아니며 모든 텍스트가 변경된 후에 전체 스크립트를 구문 분석합니다. 그런 것을 만드는 방법이 있습니까?

thks

+0

전체 내용을 다시 파싱하는 이유는 무엇입니까? VBScript는 그다지 큰 경향이 없습니다. –

+0

흠 ... http://www.cs.vu.nl/~dick/PTAPG.html 부분 파서가 가능하며 같은 것을 구축 할 방법을 찾고있었습니다. 내가 멍청한 사람이라면 용서해주십시오. 나는 전에 파서를 만들지 않았다. – redDragonzz

+0

"부분"또는 증분 파서를 만드는 것이 가능하다. 완전한 문법을 ​​위해 파서를 만드는 것보다 훨씬 어렵습니다. 그래서, 당신이 그것을 필요로하지 않는다면, 당신은 그것을 건너 뛰어야합니다. 작은 VBScript 문서의 경우 문자열에 전체 파서를 적용하여 문제가 없는지 확인할 수 있습니다. 만약 당신이 큰 프로그램을 가지고 있다면 어쩌면 이것이 중요 할 것입니다. –

답변

2

내가 처음 대신 간단한 작업하지 않은 자신을 작성하는 기존의 VBScript 파서보고 싶은데!

이 페이지의 BNF 형식의 VBScript 문법 : http://rosettacode.org/wiki/BNF_Grammar을 사용하면 ANTLR (또는 다른 구문 분석기 생성기) 문법으로 변환 할 수 있습니다.

원본의 일부만 다시 구문 분석하는 것과 같은 멋진 작업을 시도하기 전에 먼저 실제로 작동하는 파서를 만드는 것이 좋습니다.

행운을 빈다.

+0

The Gold Parser는 VBScript를 구문 분석 할 수 있습니다. http://www.devincook.com/goldparser/engine/dot-net/morozov/index.htm 및이를 기반으로 파서와 morozov가 작성한 C# 런타임을 구현했습니다. 어떻게 부분 파서를 만들까요? – redDragonzz

+0

@redDragonzz, 그러면이 정보로 원래 질문을 업데이트해야합니다. –

3

증 분식 구문 분석을 실제로 수행하려는 경우 Tim Wagner의 this paper을 고려하십시오.

기존 파스 트리를 계속 유지하고 편집 시점에서 문자열 조각의 혼합을 뒤섞고 변경되지 않은 원본 텍스트의 부분을 나타내는 트리를 구문 분석하고 문자열을 구문 분석 집합으로 다시 통합하는 것은 훌륭한 방법입니다 나무. 점진적 GLR 파서를 사용하여 수행됩니다.

구현하기 쉽지 않습니다. 나는 단지 GLR 부분을했고 점진적인 부분으로 돌아 가지 않았습니다. GLR 부분은 문제가 될만한 가치가있었습니다.

증분 구문 분석에 대한 많은 문서가 있습니다. 이것은 정말 좋은 것 중 하나입니다.

+0

좋아, 나는 이런 식으로하려고한다. ANTLR은 어떨까? 제 생각에는 추상 구문 나무를 부분적으로 구축 할 수있는 기능이 있다고 생각합니다. – redDragonzz

+0

@redDragonz : ANTLR에 대해 충분히 알지 못합니다. 필자가 말할 수있는 것은 특히 파서 생성기가 주로 전체 프로그램 (문법에 대한 목표 규칙)을 구문 분석하기 위해 주로 사용되고 점진적 파싱을 수행하는 의미있는 방법을 제공하지 않는다는 것입니다.ANTLR이이 범주에 속한다는 점을 감안할 때, 그러한 점진적인 지원을 제공한다면 놀랄 것입니다. 귀하의 마일리지가 다를 수 있습니다. –