Я написал грамматику ANTLR 3 для разбора TaskJuggler III файлов заказов (см. Ниже).
В сети
проект prj "Пример проекта" "1.0" 2010-10-24-00: 00- + 0200 - 2010-11-23-09: 00- + 0100 {
Я получаю следующие ошибки:
строка 1:42 несоответствующий символ '-' ожидаемый набор '0' .. '9'
строка 1:48 несоответствующий символ ':' ожидающий набор '0'..'9 '
строка 1:67 несоответствующий символ' - 'ожидаемый набор' 0 '..' 9 '
строка 1:73 несоответствующий символ': 'ожидающий набор' 0 '..'9 '
После этого возникает ошибка OutOfMemory .
Вот соответствующая часть грамматики:
bookingsFile возвращает [DefaultBookingsFile bookingsFile]
:
{
bookingsFile = new DefaultBookingsFile();
}
projectHeader
projectIds
(resourceDeclaration)*
(task)*
(
suppStmt=supplementStatement
{bookingsFile.addSupplementStatement ($ suppStmt.suppStmt);}
)*
;
projectHeader
:
'project prj "' ANY_TEXT '" "1.0"' TJ3_BOOKING_TIME '-'
TJ3_BOOKING_TIME '{'
'}'
;
TJ3_BOOKING_TIME
: DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT
'-' DIGIT DIGIT ':'DIGIT DIGIT' - 'TIMEZONE
;
TIMEZONE
: ('+'|'-')DIGIT DIGIT DIGIT DIGIT
;
Вопрос: Что я делаю не так?
Заранее спасибо
Дмитрий
PS: Полная версия грамматики доступна в
http://bazaar.launchpad.net/~dp-sw-dev/pcc/prototype1/files/head%3A/src/main/java/at/silverstrike/pcc/impl/tj3bookingsparser/grammar/
и ниже
grammar Bookings;
options {
backtrack=true;
memoize=true;
}
@header {
package at.silverstrike.pcc.impl.tj3bookingsparser.grammar;
}
@lexer::header {
package at.silverstrike.pcc.impl.tj3bookingsparser.grammar;
}
bookingsFile returns [DefaultBookingsFile bookingsFile]
:
{
bookingsFile = new DefaultBookingsFile();
}
projectHeader
projectIds
(resourceDeclaration)*
(task)*
(
suppStmt=supplementStatement {bookingsFile.addSupplementStatement( $suppStmt.suppStmt ); }
)*
;
projectHeader
:
'project prj "' ANY_TEXT '" "1.0"' TJ3_BOOKING_TIME '-' TJ3_BOOKING_TIME '{'
'}'
;
projectIds
:
'projectids prj'
;
resourceDeclaration
:
'resource' TJ3_IDENTIFIER TJ3_STRING
;
task
:
'task' TJ3_IDENTIFIER TJ3_STRING '{' ANY_TEXT '}'
;
supplementStatement returns [DefaultSupplementStatement suppStmt]
:
{
suppStmt = new DefaultSupplementStatement();
}
'supplement task' taskId=TJ3_DOTTED_TASK_IDENTIFIER { suppStmt.setTaskId($taskId.text); }
'{'
(
bStmt=bookingStatement {suppStmt.addBookingStatement( $bStmt.stmt ); }
)*
ANY_TEXT
'}'
;
bookingStatement returns [DefaultBookingStatement stmt]
:
{
stmt = new DefaultBookingStatement();
}
TJ3_IDENTIFIER ':'
'booking'
resource=TJ3_IDENTIFIER { stmt.setResource($resource.text); }
ib1=indBooking { stmt.addIndBooking($ib1.indBooking); }
(
','
ib2=indBooking { stmt.addIndBooking($ib2.indBooking); }
)*
overTimeEtc
;
indBooking returns [DefaultIndBooking indBooking]
:
startTime=TJ3_BOOKING_START_TIME '+' duration=TJ3_DURATION 'h'
{
$indBooking = new DefaultIndBooking($startTime.text, $duration.text);
}
;
overTimeEtc
:
'{' ANY_TEXT '}'
;
TJ3_IDENTIFIER
: ('a'..'Z'|'A'..'Z') ('a'..'Z'|'A'..'Z'|'0'..'9'|'_')*
;
DIGIT
: '0'..'9'
;
TJ3_STRING
: '"' ('a'..'z'|'A'..'Z'|'0'..'9'|' '|'_')* '"'
;
ANY_TEXT
: ('a'..'z'|'A'..'Z'|'0'..'9'|' '|'_')*
;
TJ3_DOTTED_TASK_IDENTIFIER
: TJ3_IDENTIFIER ('.' TJ3_IDENTIFIER)*
;
TJ3_BOOKING_TIME
: DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT ':' DIGIT DIGIT '-' TIMEZONE
;
TJ3_BOOKING_START_TIME
: DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT ('-' DIGIT DIGIT ':' DIGIT DIGIT)? (TIMEZONE)?;
TIMEZONE
: ('+'|'-')DIGIT DIGIT DIGIT DIGIT
;
TJ3_DURATION
: FP_VALUE ('min' | 'h' | 'd' | 'w' | 'm' | 'y')
;
FP_VALUE
: DIGIT+
| DIGIT* '.' DIGIT*
;