首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR 3解析问题

ANTLR 3解析问题
EN

Stack Overflow用户
提问于 2010-10-26 09:29:22
回答 1查看 516关注 0票数 1

我编写了一个用于解析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/

和下面

代码语言:javascript
复制
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*
    ;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-31 11:04:19

你的规则:

代码语言:javascript
复制
TJ3_BOOKING_START_TIME
  :  DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT ('-' DIGIT DIGIT ':' DIGIT DIGIT)? (('+'|'-')DIGIT DIGIT DIGIT DIGIT)?
  ;

与您输入的这一部分不匹配:

代码语言:javascript
复制
" ... 2010-10-25-00:00-+0200 ... "
//                    ^^

在您的规则中不考虑-+部分。

编辑

试着做这样的事情:

代码语言:javascript
复制
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;}
  ;

解释来文来源:

代码语言:javascript
复制
project prj "Sample project" "1.0" 2010-10-25-00:00-+0200-2010-11-24-09:00-+0100 {
}

生成解析树:

HTH

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4022323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档