我编写了一个用于解析TaskJuggler III预订文件的ANTLR 3语法(见下文)。
在线
项目prj“示例项目”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 =新DefaultBookingsFile();} projectHeader projectIds (resourceDeclaration)* (任务)*( suppStmt=supplementStatement )
{bookingsFile.addSupplementStatement( $suppStmt.suppStmt );}
)*;
projectHeader
::'project‘’ANY_TEXT‘'“1.0"’TJ3_BOOKING_TIME '-‘
TJ3_BOOKING_TIME '{‘
“}”;
TJ3_BOOKING_TIME
:“数字”-“数字”-“数字数字”
“数字数字”:“数字数字”-“时区”
;
时区
::(“+‘x’-‘)位数;
问:我做错什么了?
提前感谢
德米特里
语法的完整版本可在
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*
;发布于 2010-10-31 11:04:19
你的规则:
TJ3_BOOKING_START_TIME
: DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT ('-' DIGIT DIGIT ':' DIGIT DIGIT)? (('+'|'-')DIGIT DIGIT DIGIT DIGIT)?
;与您输入的这一部分不匹配:
" ... 2010-10-25-00:00-+0200 ... "
// ^^在您的规则中不考虑-+部分。
编辑
试着做这样的事情:
grammar Bookings;
bookingsFile
: Project Prj String String Time Hyphen Time OpenParen CloseParen EOF
;
Project
: 'project'
;
Prj
: 'prj'
;
OpenParen
: '{'
;
CloseParen
: '}'
;
Hyphen
: '-'
;
String
: '"' ~'"'* '"'
;
Time
: D D D D '-' D D '-' D D '-' D D ':' D D '-+' D D D D
;
fragment
D
: '0'..'9'
;
Space
: (' ' | '\t' | '\r'? '\n'){$channel=HIDDEN;}
;解释来文来源:
project prj "Sample project" "1.0" 2010-10-25-00:00-+0200-2010-11-24-09:00-+0100 {
}生成解析树:

HTH
https://stackoverflow.com/questions/4022323
复制相似问题