2014-07-10 3 views
0

데이터 해석 알고리즘 & 실제 데이터가 있습니다. 이 알고리즘을 사용하여 실제 데이터를 해석하고이를 보고서로 표시해야합니다.C#에서 의사 코드를 해석하는 방법?

우선, 사용자의 변수 값을 받아들이는 양식을 만들어야합니다. 변수는 다음과 같이 의사 코드로 정의됩니다. (주어진 한 예)

AGEYEARS { 
Description: Age in Years 
Type: Range; 
MinVal: 0; 
MaxVal: 124; 
Default: 0; 
ErrorAction: ERT1:=04 GRT4:=960Z; 
} 

내 Variables.txt 파일에는 여러 변수가 있습니다. 나는 StreamReader를 사용하기를 원하지 않는다.이 변수를 해석 할 때는 &이 그 행을 읽는다.

대신 하나의 개체로 XXXX {}을 (를) 읽고 Type : Range를 Attribute : Value로 읽을 수있는 논리를 찾고 있습니다. 이렇게하면 파일을 읽고 이해할 수있는 코드로 변환하는 단계를 건너 뛸 수 있습니다.

이와 같이 다른 조건의 파일도 있습니다. 예를 들어, IF 섹스 =의 '9'THEN SEX = U ENDIF

쉽고 빠른을 해석 할 수있는 방법이 있나요? 누군가 그것을 도와 줄 수 있습니까?

프로그래밍 언어로 C#을 사용하고 있습니다.

+0

.net 응용 프로그램에서 해당 워크 플로우를 사용할 수 있도록 기존 데이터 정의를로드하려면 4GL을 빌드해야합니다. –

답변

1

그래서 DSL 용 파서가 필요합니다.

문법을 쉽게 작성할 수 있도록 ANTLR에게 알려 드릴 수 있습니다.

는 여기에 대해 완전히 검증되지 않은 간단한 문법이다 :

grammar ConfigFile; 

file: object+; 
object: ID '{' property+ '}'; 
property: ID ':' value ';'; 
value: (ID|CHAR)+; 

ID: [a-zA-Z][a-zA-Z0-9_]*; 
WS: [ \t\r\n]+ -> channel(HIDDEN); 
CHAR: .; 

대체 솔루션 :

(?<id>\w+)\s*\{\s*(?:(?<prop>\w+)\s*:\s*(?<value>.+?)\s*;\s*)*\} 

그런 다음 캡처 한 정보를 추출 : 또한 정규식을 사용할 수 있습니다. 매치마다 그룹 이름이 id입니다. 그룹 propvalue은 여러 쌍의 캡처를 가지며 각 쌍은 속성을 정의합니다. C#에서

:

var text = @" 
AGEYEARS { 
    Description: Age in Years; 
    Type: Range; 
    MinVal: 0; 
    MaxVal: 124; 
    Default: 0; 
    ErrorAction: ERT1:=04 GRT4:=960Z; 
} 

OTHER { 
    Foo: Bar; 
    Bar: Baz; 
}"; 


var re = new Regex(@"(?<id>\w+)\s*\{\s*(?:(?<prop>\w+)\s*:\s*(?<value>.+?)\s*;\s*)*\}"); 

foreach (Match match in re.Matches(text)) 
{ 
    Console.WriteLine("Object {0}:", match.Groups["id"].Value); 

    var properties = match.Groups["prop"].Captures.Cast<Capture>(); 
    var values = match.Groups["value"].Captures.Cast<Capture>(); 

    foreach (var property in properties.Zip(values, (prop, value) => new {name = prop.Value, value = value.Value})) 
    { 
     Console.WriteLine(" {0} = {1}", property.name, property.value); 
    } 

    Console.WriteLine(); 
} 

이 솔루션을 파서 한만큼 '예쁜'가 아니라 외부 lib 디렉토리없이 작동합니다.

+0

안녕하세요, ANTLR은 내가 찾고있는 것과 비슷하게 보입니다. Regex가 나중에 복잡해지기 때문에 Regex를 사용하고 싶지 않습니다. 나는 단지 깨끗한 해결책을 찾고있다. 기본적으로 도메인 특정 언어 번역이 처음입니다. 그래서 나는 이것에 더 많은 도움이 필요하다. 난 언젠가 ANTLR4 레퍼런스 가이드를 구입하고 그것을 읽기 시작했습니다. Visual Studio에서 Nuget을 통해 ANTLR4를 설치하고 코드로 .g4 파일을 만들고 컴파일했습니다. 이제 Variables 문법 파일을 입력으로 받아서 C# 코드를 얻고 싶습니다. 이걸 도와 주실 수 있나요? 단계별 가이드를 볼 수있는 곳이 있습니까? –

+0

참조 가이드가있는 경우 이미 최상의 정보 출처를 가지고 있습니다. 아, 그리고 컴파일 과정을 쉽게 해주는 Visual Studio 용 ANTLR 플러그인이 있습니다. –

1

정규식을 사용하지 말라고 조언합니다. 어쩌면 처음에는 작동하지만 작업이 좀 더 복잡해지면 기술적으로이를 수행 할 수 없으므로 정규 표현식이 문제를 해결하지 못할 수도 있습니다.

더 나은 선택 (라이브러리 추가 비용)은 일부 파서를 사용하고 있습니다. C#의 경우 다른 언어의 언어만큼 많지는 않을지 모르겠지만 충분히 있습니다. Irony, Coco/R, GOLD, ANTLR, LLLPG, Sprache 또는 NLT입니다.

수학적 우선 순위 문제 (예 :ANLTR은 그 중 하나입니다 - 하향식 파서에 대한 구문 1 위 - NLT (하향식 파서)에 대한 구문 - 하향식 파서를 비교하는 것보다 "5 + 5 * 2"와 같은 식을 평가해야합니다 예를 들면. 일반적으로 첫 번째 규칙에서는 규칙을 깔끔하게 작성해야합니다 (규칙을 포함해야합니다). 후자의 경우에는 순서를 설정해야합니다 (*+ 앞에옵니다). 즉, 규칙은 우선 순위와 분리됩니다.

+1

ANTLR v4부터 더 이상 선행 규칙을 인코딩하는 데 이상한 구문을 사용하지 않아도됩니다. 우선 순위에 따라 대체 규칙을 작성하십시오. –