1

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

在线的

项目项目“示例项目”“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); }

    )*

;

项目标头

:

    '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

;

问题:我做错了什么?

提前致谢

德米特里

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

1 回答 1

1

你的规则:

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

产生解析树:

替代文字

高温高压

于 2010-10-31T11:04:19.503 回答