2010-06-25 6 views
3

bison/flex를 사용하여 간단한 xml 파서을 만들고 싶습니다. 유효성 검사, 의견, 인수가 필요하지 않습니다. 은 숫자, 문자열 또는 기타 <tag>value</tag> 일 수 있습니다. <tag>value</tag> 만 필요합니다. 그래서 예를 들면bison/flex에있는 간단한 XML 파서

는 : 도움이된다면

<div> 
    <mul> 
    <num>20</num> 
    <add> 
     <num>1</num> 
     <num>5</num> 
    </add> 
    </mul> 
    <id>test</id> 
</div> 

, I가 발생할 수 있습니다 모든 태그의 이름을 알고있다. 주어진 태그에 얼마나 많은 하위 태그를 붙잡을 수 있는지 알고 있습니다.

- new Tag("num", 1)   // tag1 
- new Tag("num", 5)   // tag2 
- new Tag("add", tag1, tag2) // tag3 
- new Tag("num", 20)   // tag4 
- new Tag("mul", tag4, tag3) 
... 
- root = top_tag 

태그 & 하위 태그의 수 :

  • NUM : 1 (전용 값)
  • STR : 1 (만 그런 일을 할 것 들소 파서를 만들 수 있습니다 값)
  • add | 서브 | 멀 | div : 2 (num | str | tag, num | str | tag)

위와 같이 AST를 만들 수 있도록 문법을 도와 주시겠습니까?

+0

XML의 하위 집합을 사용하는 것이 중요합니까?귀하의 언어가 단순히 산술 표현식으로 구성되어 있다면, 당신은'(20 * (1 + 5))/test'와 같은 문자열을 사용할 수있는 중위 표현식을 파싱하는 대신에 당신이 보길 권합니다. 다른 이유가 필요하지 않다면, 특히 파서를 작성하는 경우 XML이 과도한 것처럼 보입니다! – shambulator

+0

데이터가 XML로 유지되므로 선택의 여지가 없습니다. – user360872

+0

늦은 응답에 대한 사과; 당신은 이것에 대한 해결책에 더 가깝습니까? XML을 사용해야한다는 점을 감안할 때 이미 작성된 라이브러리를 사용하지 않는 이유는 무엇입니까? 프로그래밍 언어를 선택할 수 있습니까? 또는 파서를 작성하는 연습의 요점은 무엇입니까? 그렇다면 파서 생성기를 사용해야합니까? 이와 같이 비교적 간단한 문법의 경우 재귀 적 파서를 쉽게 작성할 수 있습니다. – shambulator

답변

1

XML 파서를 만드는 데 가장 좋은 도구라고 생각하지 않습니다. 내가이 일을해야한다면, 나는 직접 할 것이다.

플렉스 코드에는 다음이 포함됩니다. NUM이 예제에서 일치하는 정수입니다. STR 일치는 '<'또는 '>'을 포함하지 않는 문자열과 일치합니다. STOP은 모든 종료 태그와 일치합니다. START 일치 시작 태그.

<\?.*\?> { ;} 
<[a-z]+> { return START; } 
</[a-z]+> { return STOP; } 
[0-9]+ { return NUM; } 
[^><]+ { return STR; } 

들소 코드가 사용자의 요구 사항에 대한

%token START, STOP, STR, NUM 
%% 
simple_xml : START value STOP 
; 
value : simple_xml 
| STR 
| NUM 
| value simple_xml 
; 
+0

모든 XML 태그가 첫 번째 패턴과 일치하기 때문에 항상 그것들을 위해 트리거되며 START 또는 STOP을 볼 수 없습니다. START/STOP 패턴 다음에 패턴을 이동해야합니다. –

+1

첫 번째 패턴은 ""로 끝내면 START 또는 STOP이 일치하는 이유를 알 수 없습니다. "<\?" "<[?]"와 같고 " VGE

+0

수십 년 동안 사용되어 온 믿을만한 도구가 많을 때 손으로 문법 파서를 작성하는 이유는 무엇입니까? 이러한 도구는 강력하며 수천 명의 사용자가 디버깅했습니다. 직접 파서를 만들 수는 없습니다. 이것은 끔찍한 충고입니다. – shrewmouse

4

모양을, 나는 yax system가 잘 작동 생각합니다. README에서 :

yax 프로젝트의 목표는 YACC (실제로 Gnu Bison)를 사용하여 XML 문서를 구문 분석/처리하도록 허용하는 것입니다.

위의 목표를 달성하기위한 핵심 소프트웨어는 XML 문서에서 XML 어휘 토큰 스트림을 생성 할 수있는 라이브러리를 제공하는 것입니다.

yylex() 인스턴스를 작성하여 XML 문서를 구문 분석하고 처리하기 위해 토큰을 Bison 문법에 제공하도록이 스트림을 래핑 할 수 있습니다.

스트림과 Bison 문법을 사용하여 적어도 다음과 같은 종류의 작업을 수행 할 수 있습니다.

  • 가 직접 내부 데이터 구조를 생성하는 XML 문서를 구문 분석

    1. 유효성 검사 XML 문서,
    2. 구조의 DOM 나무.