2009-04-22 5 views
4

내가 작업중인 프로젝트에서 다소 이상한 데이터 소스로 작업해야합니다. 나는 그것에게 "쿼리"를 줄 수 있고 그것은 나에게 DataTable을 돌려 줄 것이다. 그러나 쿼리는 전통적인 문자열이 아닙니다. 그것은 마치 내가 원하는 기준을 정의하는 일련의 메소드 호출과 같습니다. 이 라인을 따라 뭔가 :C# : 임의의 문자열을 표현식 트리로 구문 분석하는 방법은 무엇입니까?

본질적으로
var tbl = MySource.GetObject("TheTable"); 
tbl.AddFilterRow(new FilterRow("Column1", 123, FilterRow.Expression.Equals)); 
tbl.AddFilterRow(new FilterRow("Column2", 456, FilterRow.Expression.LessThan)); 
var result = tbl.GetDataTable(); 

, 모든 표준 물건 (등 부울 연산자, 괄호, 몇 가지 기능)하지만 매일 사용하기에 매우 상세하고 불편 작성하기위한 구문을 지원합니다.

주어진 구문 (예 : "Column1 = 123 AND Column2 < 456")을 구문 분석하여 위의 함수 호출로 변환하는 작은 구문 분석기를 만들고 싶습니다. 또한, 거기에 매개 변수를 추가 할 수 있으면 좋을 것이므로 주입 공격으로부터 보호 될 것입니다. 상단에있는 설탕의 마지막 작은 조각은 동일한 쿼리가 다른 개체에서 다시 실행될 때 구문 분석 결과를 캐시하고 다시 사용할 수있는 경우에 해당합니다.

궁금한 점이 있습니다. 기존 솔루션을 사용할 수 있습니까? 아니면 내 자신의 식 구문 분석기를 준비해야합니까? 너무 복잡하지는 않지만, 2 ~ 3 일의 코딩과 버그를 수정하여 해결할 수 있다면, 그만한 가치가 있습니다.

답변

7

시험해보십시오. Irony. 설명서가 부족하지만 샘플을 통해 신속하게 작동 할 수 있습니다. Irony는 코드 구문 분석 및 추상 구문 트리 작성 프로젝트이지만 사용자의 요구에 맞는 양식을 작성하려면 약간의 논리를 작성해야 할 수도 있습니다. DLR은 추상 구문 트리 (IronPython 및 IronRuby에 사용됨)에서 동적으로 코드를 생성/실행할 수 있기 때문에이를 보완 할 수 있습니다. 두 사람은 좋은 짝을 만들어야합니다.

오, 그들은 모두 일급 .NET 솔루션과 오픈 소스입니다.

+0

거대한 외모. 내 욕구가 작아. : P –

+0

Irony 어셈블리의 크기는 171KB (디버그 버전)입니다. 소스 코드를 사용할 수 있기 때문에 필요한 경우 앱으로 컴파일 할 수 있습니다. 필요에 따라 코드를 사용하는 것이 매우 간단해야합니다 (코드가 많지 않음). 표현 파서/평가자 프로젝트에서이 코드를 사용합니다. 표현 언어가 설명했던 것보다 훨씬 복잡하지만 코드는 단지 수백 줄에 불과합니다. 반면에 DLR은 실제로 조금 더 크지 만 실제로는 필요하지 않습니다. – OregonGhost

0

Bison 또는 JavaCC 등은 문법에서 파서를 생성합니다. 그런 다음 표현식을 변환하는 고유 한 코드로 트리의 노드를 보강 할 수 있습니다.

OP 의견 : 제 소프트는 제 3 자 실행 파일을 제공하고 싶지 않습니다. 나는 그것이 내 코드로 컴파일되기를 원한다.

두 도구 모두 소스 코드을 생성합니다.

+0

저는 제 3 자 실행 파일을 제 소프트로 제공하고 싶지 않습니다. 나는 그것이 내 코드로 컴파일되기를 원한다. –

0

내가 손으로 exaclty이 사용 및 복잡성 수준 파서를 썼다. 약 2 일이 걸렸습니다. 나는 그것을했기 때문에 기쁘다. 그러나 나는 그것을 다시하지 않을 것이다. ANTLR 또는 F #의 Fslex를 사용합니다.

관련 문제