2009-05-06 4 views
3

는 I는최고의 현대 텍스트 파싱? 일명 Lex와 Yacc는 언제 사용합니까?

XYZ ARG1,ARG2,ARG3,...,ARGN 

같은 명령과 인수 행당 하나의 텍스트로서 입력 블록을하고 난 XYZ의 인자가 아니라 특정 명령에 대해 형성되는 것을 확인하고 정확한 블록을 실행할 있다면 코드. ~ 100 개의 명령과 같은 것이 있습니다. 그 중 일부는 가변 개수의 인수와 다른 관계를 가지고 있습니다 (즉, XYZ 명령이 호출 된 경우 ABC이라는 명령이 필요합니다).

COMMAND 
XYZ ARG1 
BEF ARG1 ARG2 
ENDCOMMAND 

텍스트가 COMMANDENDCOMMAND에 포함하는 것이 중요합니다 :

또한 명령과 같은 존재한다.

일반적으로 정규식이 아닌 Lex와 Yacc를 사용하지만, 더 현대적인 것이 있습니까? 이 코드는 C#으로 작성되었습니다. MSDN에 오래된 학교 C Lex와 Yacc보다는이 일을하는 것이 있습니까?

답변

1

큰 "잘 알려진 C-ish 컴파일러 컴파일러 중 어떤 것이 C#으로 작동 할 것인지 확신 할 수 없다는 점에서"나이 "보다 더 큰 문제가 있습니다. Boost의 새로운 파싱 템플릿도 마찬가지입니다. 당신은 아마 Grammatica 또는 Spart 같은 난해한 뭔가 이동해야 할 것

EDIT (내 상위 두 Google hits를 선택하는) : 을 조금 더보고 후에는 ANTLR가 C 번호에 대한 지원이 나타납니다. ANTLR은 매우 잘 알려져 있으며 LEX/YACC보다 훨씬 새롭습니다.

+0

흠 나는 틀렸다고 생각합니다. 필자는 C 파싱 라이브러리, C# 래퍼 라이브러리 및 C# 응용 프로그램을 가지고 있습니다. –

+0

작동하지 않습니까?답장을 보내 주셔서 감사합니다. 그러나 이것이 왜 작동하지 않는지 말해주십시오. 다시 한번 감사드립니다. –

+0

아, 예, 실제로 파서를 C로 만들어서 C#으로 감쌀 수 있습니다. LEX/YACC의 VisualStudio 호환 버전을 찾을 수 있다고 가정합니다. Gnu의 prebuilts는 일반적으로 Gnu 라이브러리 형식을 사용하며 Gnu 링커 (ld)가 필요합니다. –

0

.NET Framework에는 특별한 의미가 없습니다.

언뜻보기에 명령 구조가 비교적 단순 해 보이므로 수동 구문 분석이 여기에 적합하며 거의 항상 금식 솔루션입니다. 이렇게하면 구문 유효성뿐만 아니라 명령 인수의 실제 값을 정확성을 검사 할 수 있습니다.

5

Lex/Yacc의 대안을 찾고 있다면 ANTLR을 확인하십시오. 다양한 lanagages 코드 생성을 지원합니다 (including C#).

+0

Ick. 내가 똑같은 것을 게시하는 동안 너는 이것을 올렸다. 그런 일이 생길 때의 나의 일반적인 정책은 당신 (듀퍼)이 명백하게 천재이며 따라서 업보트를받을 자격이 있다는 것입니다. :-) –

+0

Hehe, 위대한 마음은 비슷하게 생각합니다. ;) 감사합니다! –

4

ANTLR은 렉싱과 파싱을 모두 처리 할 수 ​​있으며 C# (Java, C++ 및 Python 외에)을 생성 할 수 있습니다. 매우 성숙하고 많은 문서와 많은 예제가 있습니다. 또한 YACC가 제공하는 더 멋진 오류 메시지를 생성합니다.

+0

아이 만 (Ayman)과 같은 코멘트입니다. –

1

이와 같은 간단한 구문 분석 문제에 대해 재귀 적 파생 파서를 작성할 수 있습니다. 가정 할 때, 당신의 언어는 비교적 고정되어 있고 완전한 프로그래밍 언어로 성장하지는 않을 것입니다. 위험 할 경우 총알을 물고 ANTLR 또는 이와 동등한 것을 사용하십시오.