gpt4 book ai didi

java - ANTLR 3解析问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:47:32 25 4
gpt4 key购买 nike

我编写了一个ANTLR 3语法来解析TaskJuggler III预订文件(见下文)。

上线

project prj "Sample project" "1.0" 2010-10-24-00:00-+0200 - 2010-11-23-09:00-+0100 {

我收到以下错误:

line 1:42 mismatched character '-' expecting set '0'..'9'

line 1:48 mismatched character ':' expecting set '0'..'9'

line 1:67 mismatched character '-' expecting set '0'..'9'

line 1:73 mismatched character ':' expecting set '0'..'9'

此后,会发生 OutOfMemory 错误。

这是语法的相关部分:

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 '{'

    '}'

;

TJ3_BOOKING_TIME

: DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT 

'-' DIGIT DIGIT ':' DIGIT DIGIT '-' TIMEZONE

;

TIMEZONE

: ('+'|'-')DIGIT DIGIT DIGIT DIGIT

;

问题:我做错了什么?

提前致谢

德米特里

P。 S.:语法的完整版本可在以下位置找到:

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*
;

最佳答案

你的规则:

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 {
}

产生解析树:

alt text

HTH

关于java - ANTLR 3解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4022323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com