문제

고객께서는 점점 어떠한 실제 작업을 수행,내가 가려움.내려움을 쓰기 보기 엔진과 매우 비슷한 템플릿에서 시스템이 다른 언어(템플릿 Toolkit/Perl).이것은 한 사람들의 시간이 되었/에게 그것을 배우고 뭔가 새로운 종류의 프로젝트입니다.

시간을 보냈다고 코코/R ANTLR,그리고 정직하게,그것들어하지만,일부 의 코코/R 에서 침몰.불행하게도,대부분의 예로는 컴파일러를 만들기를 읽는 소스 코드,그러나 아무도 보이 덮개를 만드는 방법에 대한 프로세서 템플릿을 합니다.

예,사람들은 같은 일을 수는 없지만 내는 방법을 정의하는 언어를 위한 템플릿에서 대부분의 원본이 html 이 아닌 실제 코드는 구문 분석하고 실행합니다.

이 있는 초보자를위한 좋은 자원이 이런 종류의 것은?을 촬영했 ganer 스파크에서는 나타나지 않았을 문법에 repo.

어쩌면 그것이 과잉,그리고 하나는 그냥 테스트 템플릿 구문으로 c#에서 파일을 컴파일합니다. http://msdn.microsoft.com/en-us/magazine/cc136756.aspx#S2

당신이 내 신발과 되지 않은 언어들 전문가,어디서부터 시작하시겠습니까?

도움이 되었습니까?

해결책

Spark 문법으로 구현되는 종류의 유창한 도메인 특정 언어입니다.

그것은 선언에 몇 가지 레이어입니다.규칙을 인식하는 html 구문을 선언 MarkupGrammar.cs -그에 따라 문법 규칙을 직접 복사에서는 xml spec.

태그 규칙을 참조하 제한 하위 집합의 csharp 구문에 규칙에서 선언 CodeGrammar.cs -그는 하위 집합이기 때문에 불꽃만 충분히 인식하 csharp 를 조정하는 단 하나의 주위에 따옴표 문자열을 두 번호,일치 curley 교정기,등등.

개인 규칙은 자신의 유형 ParseAction<TValue> 대 는 받아들일 위치ParseResult.이 ParseResult 은 간단한 클래스를 포함하는 특정 조건에 맞는 마지막 데이터 항목에서 구문 분석 작업하고 새로운 위치를 인스턴스는 고급 지난 콘텐츠 제작 형식.

지 않는 아주에 유용한 그것의 자신의할 때까지 소개 적은 수의 연산자, 에 설명된 대로, 분석 표현식 문법, 을 결합 할 수있는 단 하나 구문 분석 작업을 구축한 강력한 표현의 형태에 대해 다른 문법을 구성 합니다.

의 기술을 사용하여는 대리자로 구문 분석 작업에서 나온크로의 블로그에 포스트 Monadic Parser 콤비네이터를 사용하여 C#3.0.내가 쓴 게시물에 대 를 만드는 도메인 특정 언어를 구문 분석.

그것은 또한 전체 가능한 경우에,당신이 좋아하는 참조 Spark.dll 어셈블리 및 상속받은 클래스에서 기본 CharGrammar 을 만드는 완전히 새로운 문법에 대한 특정한 구문입니다.그것은 아마도 가장 빠른 방법과 실험을 시작하는 이 기술의 예에서 찾을 수 있습니다 CharGrammarTester.cs.

다른 팁

1 단계 1. 정규 표현식 (Regexp 대체)을 사용하여 입력 템플릿 문자열을 토큰 목록으로 분할하십시오.

hel<b>lo[if foo]bar is [bar].[else]baz[end]world</b>!

에게

write('hel<b>lo')
if('foo')
write('bar is')
substitute('bar')
write('.')
else()
write('baz')
end()
write('world</b>!')

2 단계. 토큰 목록을 구문 트리로 변환합니다.

* Sequence
** Write
*** ('hel<b>lo')
** If
*** ('foo')
*** Sequence
**** Write
***** ('bar is')
**** Substitute
***** ('bar')
**** Write
***** ('.')
*** Write
**** ('baz')
** Write
*** ('world</b>!')

class Instruction {
}
class Write : Instruction {
  string text;
}
class Substitute : Instruction {
  string varname;
}
class Sequence : Instruction {
  Instruction[] items;
}
class If : Instruction {
  string condition;
  Instruction then;
  Instruction else;
}

3 단계 3. 재귀 함수 (통역사라고 함)를 작성하여 나무를 걷고 지침을 실행할 수 있습니다.

다른 대안 접근법 (1-3 단계 대신) 언어가 eval () (예 : Perl, Python, Ruby 등)을 지원하는 경우 : regexp 대체를 사용하여 템플릿을 eval ()-호스트 언어로 변환합니다. 템플릿을 인스턴스화하려면 Eval ()를 실행하십시오.

할 일이 너무 많습니다. 그러나 그것은 간단한 GET 문과 테스트에서 작동합니다. 그것은 시작입니다.

http://github.com/claco/tt.net/

결국, 나는 이미 Loudejs의 방법을 제공하기 위해 Antlr에서 너무 많은 시간을 가졌습니다. 파서/렉서보다는 전체 과정에서 조금 더 시간을 보내고 싶었습니다. 어쩌면 버전 2에서 뇌가 조금 더 이해할 때 스파크 방식으로 갈 수 있습니다.

Vici Parser (이전에는 lazyparser.net으로 알려져 있음)는 시작하는 데 도움이되는 오픈 소스 토큰 화기/템플릿 파서/표현 파서입니다.

그것이 당신이 찾고있는 것이 아니라면 소스 코드를 보면 아이디어를 얻을 수 있습니다.

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