당신이 COBOL의 영상 문자열을 구문 분석하려고 할 때 왜 NumericConstant()
로 장난하는 도움을 많이?
void DataPictureClause() :
{}
{
(<PICTURE> | <PIC>) [ <IS> ] PictureString()
}
--9
비트가 그림 문자열이며, PictureString()
기능을 분석한다 :
당신이 가지고있는 JavaCC에 소스에 따르면, COBOL 사진과 함께 분석해야
void PictureString() :
{}
{
[ PictureCurrency() ]
((PictureChars())+ [ <LPARENCHAR> IntegerConstant() <RPARENCHAR> ])+
[ PicturePunctuation() ((PictureChars())+ [ <LPARENCHAR> IntegerConstant() <RPARENCHAR> ])+ ]
}
PictureCurrency()
온다 비어있는 빈 공간이므로 PictureChars()
으로 이동 :
void PictureChars() :
{}
{
<INTEGER> | <COBOL_WORD>
}
아마 품질 파서를 구축하기 위해 존재 가장 어려운 언어 중 하나입니다 사실,
<COBOL_WORD: ((["0"-"9"])+ (<MINUSCHAR>)*)*
(["0"-"9"])* ["a"-"z"] (["a"-"z","0"-"9"])*
((<MINUSCHAR>)+ (["a"-"z","0"-"9"])+)*
>
구문 분석 COBOL가 쉽지 않다 :3210
그러나 COBOL_WORD
많은 "흥미로운"유효한 영상 절 정의를 지원하기 위해 표시되지 않습니다 에 대한 이제 아주 단순하고 아마도 완전히 인공적인 COBOL 프로그램 예제를 제외하고는 당신이 일하는 JavaCC 소스가 그것을 자르지 않을 것이라고 말할 수 있습니다.
답변
COBOL 그림 문자열이 엉망 파서의 최고의 경향 언급한다. 당신은 문제가있는 인 빼기 부호가 빙산의 일각 일뿐입니다!그림 문자열 은 의 구문 분석이 어려우므로 마침표와 쉼표 이 그림 문자열의 일부일 수 있지만 문자열 외부의 구분 기호로 사용될 수 있습니다. 즉, 파서가 문맥 상 자유롭게 마침표 또는 쉼표를 명확하게 구분할 수없는 을 의미합니다.. 마주 치게되는 문맥을 "인식"하기 위해서는 이 필요합니다. 이것은 사소한 것처럼 들리 겠지만 그렇지 않습니다.
기술적으로 구분 기호와 쉼표 뒤에는 공백 (또는 줄의 끝)이 와야합니다. 이 그림 문자열 에 공백을 포함 할 수 없기 때문에 약간의 사실은 마침표/쉼표 역할을 매우 간단하게 결정할 수 있습니다. 그러나 많은 상업용 COBOL 컴파일러는 뒤에 공백이 오지 않는 구분 기호 마침표/쉼표를 올바르게 인식 할 정도로 "스마트"합니다. 따라서 불법적 인 구분 기호/쉼표를 코딩하는 많은 COBOL 프로그래머가 있습니다. 즉, 을 처리해야 할 것입니다.
결론은 당신이 무엇을하든, 그 작은 사진 문자열이 무상 출입하는 당신에게가는 것입니다. 그들은 대처하기 위해 많은 노력을 기울일 것입니다. 다음과 같은 구문 분석하는 방법을
오는 것들을 그냥 힌트 :
이
01 DISP-NBR-1 PIC -99,999.
01 DISP-NBR-2 PIC -99,999..
01 DISP-NBR-3 PIC -99,999, .
01 DISP-NBR-4 PIC -99,999,.
DISP-NBR-1
을 다음 기간은 그림 문자열을 종료합니다. 분리 기호입니다. 뒤에 오는 마침표는 문자열의 일부이고 두 번째 마침표는 구분 기호입니다. 쉼표 다음에 오는 DISP-NBR-3
은 구분 기호입니다. 그림 문자열에는 포함되어 있지 않습니다. 그러나 쉼표 다음에 DISP-NBR-4
은 공백이 없기 때문에 그림 문자열의 일부입니다.
COBOL에 오신 것을 환영합니다.
COBOL_WORD는 하나의 토큰입니다. '07 STRINGFIELD2 PIC AAAA.'에는 여러 개의 토큰이 포함되어 있습니다. 그 중 일부는 COBOL_WORD (예 : STRINGFIELD2)로 분류되며 일부는 다르게 분류됩니다 (예 : 'AAAA'이후의 PIC 및 구분 기호). REDEFINES는 예약어이므로 COBOL_WORD로 구문 분석해서는 안됩니다. 이미 참조한 JavaCC 소스에는'REDEFINES' 규칙이 있으므로이 규칙을 사용해야합니다. – NealB
감사합니다. @NealB. 테스트하는 동안'07 STRINGFIELD2 PIC ----, ---, --- --- 99'을 입력하면 해석 오류가 발생하지 않습니다. 즉. ParseException는 Throw되지 않습니다. 왜 이럴 수 있니? 그것이하는 모든 것은 그 데이터 이름을 파싱하지 않고 그 이후의 모든 것을 일으키지 않고 예외를 파싱하지 않는다. – Decrypter
Cobol_word 답변에 추가로. PIC 기호 다음에 사용할 수있는 일종의 그림 단어 (PIC_WORD)가 없습니까? 그 점에서 나는 나의 예에서 대시를지지 할 수 있었다. 또한 javacc에서 대시는 구분 기호로 사용되지 않으므로 생각했던 그림 절을 처리 할 수 있어야합니다. 모든 질문에 사과드립니다. 나는 이것을 매우 흥미롭게 느낀다. – Decrypter