Почему вы возитесь с 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!