2012-11-08 2 views
2

어휘 분석기를 만들기위한 임무가 있으며, 1 비트를 제외하고는 모든 것이 작동합니다. 줄 바꿈을 허용하는 문자열을 작성해야하며 문자열은 큰 따옴표로 구분됩니다. 문자열은 구분 기호 내에서 숫자, 문자, 특정 구두점, 백 슬래시 및 큰 따옴표를 허용합니다. 새 줄 문자를 이스케이프 처리하는 방법을 알아낼 수 없습니다. 새 줄과 탭과 같은 문자를 이스케이프 처리하는 특정 방법이 있습니까?JavaCC에서 새 줄에 백 슬래시 이스케이프 문자를 사용하는 방법은 무엇입니까?

여기 그래서 내 문자열 등 백 슬래시, 공백, 숫자처럼 다음, 견적을 다음과 같은 문자를 허용해야

< STRING : (< QUOTE> (<QUOTE> | <BACKSLASH> | <ID> | <NUM> | " ")* <QUOTE>) > 
< #QUOTE : "\"" > 
< #BACKSLASH : "\\" > 

도움이 될 것을 내 코드의 일부를, 그리고 다음 다른 다음 인용문. "\ n"과 같은 개행 문자가 작동하지 않습니다. 미리 감사드립니다.

+1

이미 시도한 것에 대해 좀 더 구체적으로 설명해 주실 수 있습니까? –

+0

백 슬래시와 따옴표를 백 슬래시 문자로 회피하고 있지만, 개행 문자 "\ n"또는 "\ r"을 사용하려고하면 작동하지 않습니다. 줄 바꿈 문자를 이스케이프하는 형식이 확실하지 않습니다. –

답변

1

문자열 리터럴의 경우 JavaCC는 Java 구문을 빌립니다. 따라서 캐리지 리턴을 포함하는 단일 문자 리터럴은 "\r"으로 이스케이프되며 줄 바꿈을 포함하는 한 문자 리터럴은 "\n"으로 이스케이프됩니다.

그러나 처리 된 문자열 값은 단일 문자입니다. 그것은 탈출 그 자체가 아닙니다. 그래서, 당신은 줄 바꿈에 대한 토큰을 정의한다고 가정

< LF : "\n" > 

토큰 <LF>의 일치 한 줄 바꿈 문자 될 것입니다. 다른 토큰의 정의에서 토큰을 대체 할 때, 단일 문자는 효과적으로 대체됩니다.

< STRING : "\"" (<LF>) "\"" > 

토큰 <STRING>의 일치 세 문자 될 것입니다 : 인용 부호, 줄 바꿈 다음에 인용 부호 다음에 그래서, 당신은 더 높은 수준의 정의가 있다고 가정합니다. 당신이 대신 원하는 것은 이스케이프 시퀀스를 인식 할 수 있도록하기위한 것입니다 : 인용 부호, 다음에 줄 바꿈을 나타내는 이스케이프 시퀀스, 다음 :

< STRING : "\"" ("\\n") "\"" > 

이제 토큰 <STRING>의 경기는 네 문자 될 것입니다 인용 부호.

현재 정의에서 인용 부호와 백 슬래시와 같이 자주 이스케이프 된 다른 메타 문자도 이스케이프 시퀀스가 ​​아닌 문자 그대로 인식됩니다.