Эта грамматика кобола не справляется - 9 фото - PullRequest
0 голосов
/ 27 сентября 2011

Я использую грамматику на этом сайте в моем javacc. Он отлично работает, кроме некоторых утверждений изображения. Например ----, ---, ---. 99 или --9.

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

Кажется, не нравится больше, чем один рывок.

Что мне нужно изменить в этом, чтобы поддержать мои примеры изображений.

Я запутался с

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

но, похоже, ничего не работает. Любая помощь очень ценится

EDIT:

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

Это регулярное выражение для всей этой строки:

07 STRINGFIELD2 PIC AAAA. ??

Если я хочу принять 05 TEST3 REDEFINES TEST2 PIC X(10)., я бы изменил регулярное выражение на:

<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"])+)*

Большое спасибо за помощь

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Почему вы возитесь с NumericConstant(), когда пытаетесь проанализировать строку ИЗОБРАЖЕНИЕ COBOL?

Согласно имеющемуся у вас источнику JavaCC, ИЗОБРАЖЕНИЕ COBOL должно анализироваться с:

void DataPictureClause() :
{}
{
  ( <PICTURE> | <PIC> ) [ <IS> ] PictureString()
}

бит --9 является строкой изображения и должен анализироваться с помощью функции PictureString():

void PictureString() :
{}
{
    [ PictureCurrency() ]
    ( ( PictureChars() )+ [ <LPARENCHAR> IntegerConstant() <RPARENCHAR> ] )+
    [ PicturePunctuation() ( ( PictureChars() )+ [ <LPARENCHAR> IntegerConstant() <RPARENCHAR> ] )+ ]
}

PictureCurrency() выходит пустым, поэтому перейдите к PictureChars():

void PictureChars() :
{}
{
    <INTEGER> | <COBOL_WORD>
}

Но COBOL_WORD, по-видимому, не поддерживает многие "интересные" допустимые определения предложений PICTURE:

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

Синтаксический анализ COBOL не прост, на самом деле это, вероятно, один из самых сложных языков в существовании.создать качественный парсер для.Я могу сказать вам прямо сейчас, что исходный код JavaCC, из которого вы работаете, не собирается его сокращать - за исключением некоторых очень простых и, вероятно, полностью искусственных примеров программ на языке COBOL.

Ответ на комментарий

COBOL Строки изображений, как правило, портят лучшее из парсеров.Знак минус, с которым у вас проблемы, - это только верхушка айсберга!Строки рисунка трудно проанализировать, потому что точка и запятая могут быть частью строки рисунка, но служат разделителями вне строки.Это означает, что парсеры не могут однозначно классифицировать точку или запятую безконтекстным образом .Они должны быть «осведомлены» о контексте, в котором они встречаются.Это может звучать тривиально, но это не так.

Технически, за разделителем и запятой должен следовать пробел (или конец строки).Этот небольшой факт может сделать определение роли точка / запятая очень простым, потому что строка изображения не может содержать пробел.Однако многие коммерческие компиляторы COBOL достаточно «умны», чтобы правильно распознавать разделительные точки / запятые, за которыми не следует пробел.Следовательно, есть много программистов на COBOL, которые кодируют недопустимые разделительные точки / запятые, что означает, что вам, вероятно, придется иметь с ними дело.

Суть в том, что независимо от того, что вы делаете, эти маленькие Picture Strings собираютсяпреследовать тебя.Им потребуется немало усилий, чтобы разобраться.

Просто намек на будущее, как бы вы проанализировали следующее:

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-2 является частью строки, второй период является разделителем.Запятая, следующая за DISP-NBR-3, является разделителем - она ​​не является частью строки Picture.Однако запятая, следующая за DISP-NBR-4, является частью строки Picture, поскольку за ней не следует пробел.

Добро пожаловать в COBOL!

0 голосов
/ 06 мая 2012

Я обнаружил, что мне пришлось переключить лексер в другой режим, когда я получил КАРТИНКУ. Строка COBOL PICTURE имеет совершенно другую «лексику», чем остальная часть языка, и вы должны отговаривать рычаг делать что-либо с точками, запятыми и т. Д., Кроме как накапливать их в строку изображения. См. Ответ NealB о некоторых примерах того, когда нужно остановить сканирование изображений.

Понятия не имею, почему вы хотите включить в слово фразу REDEFINES. Просто разбери это нормально в парсере.

...