2011-09-27 4 views
0

이 사이트의 문법은 javacc에서 사용하고 있습니다. 그것은 일부 그림 진술과는 별개로 잘 작동합니다. 예 : ----, ---, ---. 99 또는 --9. 이 cobol 문법이 처리하지 않습니다 - 9 그림

http://mapage.noos.fr/~bpinon/cobol.jj

하나 이상의 대시를 좋아하지 않는 것

.

그림 예제를 지원하려면 무엇을 변경해야합니까?

은 I'v은

void NumericConstant() : 
{} 
{ 
    (<PLUSCHAR>|<MINUSCHAR>)? IntegerConstant() [ <DOTCHAR> IntegerConstant() ] 
} 

약 엉망하지만 아무것도 작동하는 것 같다. 어떤 도움이 많이 감사합니다

편집 :

07 STRINGFIELD2 PIC AAAA. ?? 

내가 05 TEST3 REDEFINES TEST2 PIC X(10).을 허용하려면 내가 할 정규식을 바꿀 것 :

<COBOL_WORD: ((["0"-"9"])+ (<MINUSCHAR>)*)* 
    (["0"-"9"])* ["a"-"z"] (["a"-"z","0"-"9"])* 
    ((<MINUSCHAR>)+ (["a"-"z","0"-"9"])+)* 
> 

는이 라인 전체에 대한 일반 식입니다

<COBOL_WORD: ((["0"-"9"])+ (<MINUSCHAR>)*)* 
(<REDEFINES> (["0"-"9"])* ["a"-"z"] (["a"-"z","0"-"9"])*)? 
    (["0"-"9"])* ["a"-"z"] (["a"-"z","0"-"9"])* 
    ((<MINUSCHAR>)+ (["a"-"z","0"-"9"])+)* 

덕분에 지금까지

+0

COBOL_WORD는 하나의 토큰입니다. '07 STRINGFIELD2 PIC AAAA.'에는 여러 개의 토큰이 포함되어 있습니다. 그 중 일부는 COBOL_WORD (예 : STRINGFIELD2)로 분류되며 일부는 다르게 분류됩니다 (예 : 'AAAA'이후의 PIC 및 구분 기호). REDEFINES는 예약어이므로 COBOL_WORD로 구문 분석해서는 안됩니다. 이미 참조한 JavaCC 소스에는'REDEFINES' 규칙이 있으므로이 규칙을 사용해야합니다. – NealB

+0

감사합니다. @NealB. 테스트하는 동안'07 STRINGFIELD2 PIC ----, ---, --- --- 99'을 입력하면 해석 오류가 발생하지 않습니다. 즉. ParseException는 Throw되지 않습니다. 왜 이럴 수 있니? 그것이하는 모든 것은 그 데이터 이름을 파싱하지 않고 그 이후의 모든 것을 일으키지 않고 예외를 파싱하지 않는다. – Decrypter

+0

Cobol_word 답변에 추가로. PIC 기호 다음에 사용할 수있는 일종의 그림 단어 (PIC_WORD)가 없습니까? 그 점에서 나는 나의 예에서 대시를지지 할 수 있었다. 또한 javacc에서 대시는 구분 기호로 사용되지 않으므로 생각했던 그림 절을 처리 할 수 ​​있어야합니다. 모든 질문에 사과드립니다. 나는 이것을 매우 흥미롭게 느낀다. – Decrypter

답변

1

당신이 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에 오신 것을 환영합니다.

+0

당신의 의견을 보내 주셔서 감사합니다. 나는 MINUSCHAR 토큰에서 "-"대신에 정규식을 사용할 수 있다고 생각하고있었습니다. [ "-"] + 같은 것이 있습니까? 그게 효과가 있을지 확실하지 않습니다. 어떻게하면 내 예제 (- 9)와 함께 작동합니까? – Decrypter

+0

@Decrypter - 내 대답에 추가되었지만 좋은 소식은 아닙니다. – NealB

+0

좋은 답변입니다. 그것은 도전적인 것처럼 보입니다. 나는 또한 현재의 문법으로 작동하지 않는 재정의를 시도하고 구현하고 싶다. 예를 들어. 05 TEST3 테스트 2 PIC X (10) 다시 정의하십시오. 이를 달성하기 위해 COBOL_WORD 토큰을 편집해야합니까? – Decrypter

0

그림을 얻었을 때 렉서를 다른 모드로 전환해야한다는 것을 알았습니다. COBOL PICTURE 문자열은 나머지 언어와 완전히 다른 '어휘'를 가지고 있으므로 레버를 그림 문자열에 누적하는 것 이외에 마침표, 쉼표 등으로 무엇이든하지 못하게해야합니다. 그림 스캔을 중단 할시기를 아는 몇 가지 예는 NealB의 대답을 참조하십시오.

단어에 REDEFINES 구를 통합하려는 이유가 전혀 없습니다. 파서에서 정상적으로 파싱하면됩니다.

관련 문제