2010-08-16 5 views
3

라텍스와 비슷한 간단한 언어로 파서를 작성하려고합니다. 예를 들어 두 개의 \ commands [with] {some} {parameters}가있는 구조화되지 않은 텍스트가 많이 포함되어 있습니다. 사이. \\와 같은 이스케이프 시퀀스도 고려해야합니다.Java에서 라텍스와 유사한 언어를 파싱

JavaCC를 사용하여 파서를 생성하려고 시도했지만 JavaCC와 같은 컴파일러 컴파일러가 일반적으로 범용 프로그래밍 언어에 적합한 구조화 된 코드에만 적합하고 지저분한 라텍스와 유사하지 않은 것처럼 보입니다. 마크 업. 지금까지 저 레벨로 가야하고 내 자신의 유한 상태 머신을 작성해야만합니다.

그럼 내 질문은 중간에 몇 개의 라텍스 식 명령 만 사용하여 대부분 구조화되지 않은 입력을 구문 분석하는 가장 쉬운 방법은 무엇입니까?

EDIT : Latex 명령을 중첩 할 수 있기 때문에 유한 상태 기계로 로우 레벨로가는 것은 어렵습니다. \ cmd1 {\ cmd2 {\ cmd3 {...}}}

+1

(HTTP : //stackoverflow.com/questions/1669/learning-to-write-a-compiler). 당신의 문제는 수작업으로 재귀 적으로 발생하는 하강 접근법이 적합 할만큼 충분히 작을 수 있습니다. 또한 필자는 렉싱 (lexing)과 파싱 (parsing)이 서로 섞여있을 수도 있다고 생각한다. – dmckee

답변

4

최악의 캐스팅에서는 문자를 사용하여 문자를 사용하여 라텍스 입력을 허용하도록 문법을 정의 할 수 있습니다. JavaCC는이 목적으로 만 잘 작동해야합니다.

문법 및 파서 생성기에 대한 좋은 점은 FSA에서 문제가되는 항목, 특히 중첩 된 구조를 구문 분석 할 수 있다는 것입니다.

문법에서 첫 번째 컷 (난이 유효 JavaCC에 있는지 모르겠지만, 합리적인 EBNF입니다) 수 : 정규 자원 [컴파일러를 작성하는 학습]입니다

Latex = item* ; 
item = command | rawtext ; 
command = command arguments ; 
command = '\' letter (letter | digit)* ; -- might pick this up as lexeme 
letter = 'a' | 'b' | ... | 'z' ; 
digit= '0' | ... | '9' ; 
arguments = epsilon | '{' item* '}' ; 
rawtext = (letter | digit | whitespace | punctuationminusbackslash)+ ; -- might pick this up as lexeme 
whitespace = ' ' | '\t' | '\n' | '\:0D' ; 
punctuationminusbackslash = '!' | ... | '^' ; 
+0

예, 유효한 해결책 인 것 같습니다. 하지만 단일 문자 토큰으로 텍스트를 분할하면 성능이 현저히 떨어지는 지 궁금합니다. –

+0

@python 멋쟁이 : 라텍스 파일이 거대한 경우가 아니라면이 문제가 많은지 의심 스럽습니다. 당신이 요구 한 것은 이것을하는 "가장 쉬운"방법이었습니다. 더 빠르게 만들고 싶다면, 비 터미널 (rawtext 등)의 일부를 더 전통적인 어휘로 구현할 수 있습니다. 좀 더 쉽게하기 위해 문법을 약간 수정했습니다. –