2011-09-04 71 views
1

我有一个语法文件Bookings.g和我试图用该语法解析的文件。ANTLR:无关输入问题

为什么我会收到这些错误?

线1:12的外来输入 ' “PCC”' 希望字符串 线3:0不匹配的输入 '}' 期待ScenarioPart1 线7:13不匹配的输入 ' “R”' 希望字符串 线9:8不匹配的输入“‘娃娃’”希望字符串 线15:8不匹配的输入“‘火车’”希望字符串 线21:8不匹配的输入“‘球’”希望字符串 线34:0在“}”

缺少EOF 语法

grammar Bookings; 

@members 
{ 
    private DefaultBookingsFile bookingsFile; 

    public DefaultBookingsFile getBookingsFile() 
    { 
     return this.bookingsFile; 
    } 

} 

@header { 

package at.silverstrike.pcc.impl.tj3bookingsparser.grammar; 

import org.slf4j.Logger; 

} 

@lexer::header { 
package at.silverstrike.pcc.impl.tj3bookingsparser.grammar; 
} 

bookingsFile 
    : 
    { 
     this.bookingsFile = new DefaultBookingsFile(); 
    } 
    header 
    projectIds 
    resourceDeclaration 
    task+ 
    (
    suppTask=supplementTask { this.bookingsFile.addSupplementStatement($suppTask.suppStmt); } 
)* 
    supplementResource* 
    EOF 
    ; 

header 
    : 
    Project Prj String String DateTimeWithTimeZone Hyphen DateTimeWithTimeZone OpenParen TimeZone Utc 
    ScenarioPart1 OpenParen ScenarioPart2 CloseParen 
    CloseParen 
    ; 

ScenarioPart1 
    : 
    'scenario plan "Plan"' 
    ; 

ScenarioPart2 
    : 
    'active yes' 
    ; 

TimeZone 
    : 
    'timezone' 
    ; 

Utc 
    : 
    '"'A+'"' 
    ; 

projectIds: 
    Projectids Prj 
    ; 

resourceDeclaration 
    : Resource Identifier String 
    ; 

task 
    : 
    Task Identifier String OpenParen 
    (task)* 
    (Start DateTimeWithTimeZone 
    End DateTimeWithTimeZone 
    Scheduling Asap 
    Scheduled)* 
    CloseParen 
    ; 

/* (Complete FloatingPointNumber)* */ 

supplementTask returns [DefaultSupplementStatement suppStmt] 
    : 
     { 
      suppStmt = new DefaultSupplementStatement(); 
     } 
    Supplement Task taskId=Identifier {suppStmt.setTaskId($taskId.text); } 
    OpenParen 
    (
    bStmt=booking {suppStmt.addBookingStatement($bStmt.stmt); } 
    )* 
    Priority IntegerNumber 
    CloseParen 
    ; 

supplementResource 
    : 
    Supplement Resource Identifier OpenParen 
    workinghours+ 
    CloseParen 
    ; 

workinghours 
    : 
    Workinghours DayOfWeek (Off|workingIntervals) 
    ; 

Workinghours 
    : 'workinghours' 
    ; 

workingIntervals 
    : 
    workingInterval (Comma workingInterval)* 
    ; 

workingInterval 
    : Time Hyphen Time 
    ; 

Time 
    : IntegerNumber Colon IntegerNumber 
    ; 

Colon 
    : 
    ':' 
    ; 

Comma 
    : 
    ',' 
    ; 

DayOfWeek 
    : 'mon' 
    | 'tue' 
    | 'wed' 
    | 'thu' 
    | 'fri' 
    | 'sat' 
    | 'sun' 
    ; 

Off 
    : 
    'off' 
    ; 

booking returns [DefaultBookingStatement stmt] 
    : 
    { 
     stmt = new DefaultBookingStatement(); 
    } 
    Booking resource=Identifier { stmt.setResource($resource.text); } 
    bt1=bookingTime { stmt.addIndBooking($bt1.indBooking); } 
    (Comma 
    bt2=bookingTime { stmt.addIndBooking($bt2.indBooking); } 
    )* 
    (OpenParen 
    overtime 
    CloseParen) 
    ; 

bookingTime returns [DefaultIndBooking indBooking] 
    : 
    startTime=DateTimeWithTimeZone 
    Plus 
    bookingDuration=FloatingPointNumberDuration 
    { 
     $indBooking = new DefaultIndBooking($startTime.text, $bookingDuration.text); 
    } 
    ; 

Booking 
    : 
    'booking' 
    ; 

Plus 
    : 
    '+' 
    ; 

duration 
    : 
    FloatingPointNumber 'h' 
    ; 

overtime 
    : 
    Overtime IntegerNumber 
    ; 

Overtime 
    : 
    'overtime' 
    ; 

Supplement 
    : 
    'supplement' 
    ; 

Priority 
    : 
    'priority' 
    ; 

Complete 
    : 
    'complete' 
    ; 

Start 
    : 
    'start' 
    ; 

End 
    : 
    'end' 
    ; 

Scheduling 
    : 
    'scheduling' 
    ; 

Asap 
    : 
    'asap' 
    ; 

Scheduled 
    : 
    'scheduled' 
    ; 

Task 
    : 
    'task' 
    ; 

Resource 
    : 
    'resource' 
    ; 

Projectids 
    : 
    'projectids' 
    ; 

Project 
    : 'project' 
    ; 

Prj 
    : 'prj' 
    ; 

OpenParen 
    : '{' 
    ; 

CloseParen 
    : '}' 
    ; 

Hyphen 
    : '-' 
    ; 

FloatingPointNumber 
    : D+'.'D+ 
    ; 
FloatingPointNumberDuration 
    : D+ P D+ H 
    ; 

IntegerNumber 
    : D+ 
    ; 

Identifier 
    : (D|A|P)+; 

String 
    : '"' ~'"'* '"' 
    ; 

DateTimeWithTimeZone 
    : D D D D '-' D D '-' D D '-' D D ':' D D '-+' D D D D 
    ; 

fragment  
D 
    : '0'..'9' 
    ; 

fragment 
A 
    : 'A'..'Z' 
    | 'a'..'z' 
    ; 

fragment 
P 
    : '.' 
    ; 

fragment 
H 
    : 'h' 
    ; 


Space 
    : (' ' | '\t' | '\r'? '\n'){$channel=HIDDEN;} 
    ; 

文件来分析

project prj "pcc" "1.0" 2011-09-04-00:00-+0000 - 2011-10-04-10:00-+0000 { 
    timezone "UTC" 
    scenario plan "Plan" { 
    active yes 
    } 
} 

projectids prj 

resource R62 "R" 

task T1 "Doll" { 
    start 2011-09-05-14:00-+0000 
    end 2011-09-05-16:00-+0000 
    scheduling asap 
    scheduled 
} 
task T2 "Train" { 
    start 2011-09-05-11:00-+0000 
    end 2011-09-05-14:00-+0000 
    scheduling asap 
    scheduled 
} 
task T4 "Ball" { 
    task T3 "Big ball" { 
    start 2011-09-05-09:00-+0000 
    end 2011-09-05-11:00-+0000 
    scheduling asap 
    scheduled 
    } 
    task T5 "Small ball" { 
    start 2011-09-05-16:00-+0000 
    end 2011-09-05-17:00-+0000 
    scheduling asap 
    scheduled 
    } 
} 
supplement task T1 { 
    booking R62 2011-09-05-14:00-+0000 + 2.0h { overtime 2 } 
    priority 997 
    projectid prj 
} 
supplement task T2 { 
    booking R62 2011-09-05-11:00-+0000 + 3.0h { overtime 2 } 
    priority 998 
    projectid prj 
} 
supplement task T4 { 
    priority 0 
    projectid prj 
} 
supplement task T4.T3 { 
    booking R62 2011-09-05-09:00-+0000 + 2.0h { overtime 2 } 
    priority 1000 
    projectid prj 
} 
supplement task T4.T5 { 
    booking R62 2011-09-05-16:00-+0000 + 1.0h { overtime 2 } 
    priority 996 
    projectid prj 
} 
supplement resource R62 { 
    workinghours sun off 
       workinghours mon 9:00 - 17:00 
       workinghours tue 9:00 - 17:00 
       workinghours wed 9:00 - 17:00 
       workinghours thu 9:00 - 17:00 
       workinghours fri 9:00 - 17:00 
       workinghours sat off 
} 

UPD,2011年5月9日00:24 CEST:这里有一个工作的纠正语法文件。

grammar Bookings; 

@members 
{ 
    private DefaultBookingsFile bookingsFile; 

    public DefaultBookingsFile getBookingsFile() 
    { 
     return this.bookingsFile; 
    } 

} 

@header { 

package at.silverstrike.pcc.impl.tj3bookingsparser.grammar; 

import org.slf4j.Logger; 

} 

@lexer::header { 
package at.silverstrike.pcc.impl.tj3bookingsparser.grammar; 
} 

bookingsFile 
    : 
    { 
     this.bookingsFile = new DefaultBookingsFile(); 
    } 
    header 
    projectIds 
    resourceDeclaration 
    task+ 
    (
    suppTask=supplementTask { this.bookingsFile.addSupplementStatement($suppTask.suppStmt); } 
)* 
    supplementResource* 
    EOF 
    ; 

header 
    : 
    Project Prj String String DateTimeWithTimeZone Hyphen DateTimeWithTimeZone OpenParen TimeZone String 
    ScenarioPart1 OpenParen ScenarioPart2 CloseParen 
    CloseParen 
    ; 

ScenarioPart1 
    : 
    'scenario plan "Plan"' 
    ; 

ScenarioPart2 
    : 
    'active yes' 
    ; 

TimeZone 
    : 
    'timezone' 
    ; 

projectIds: 
    Projectids Prj 
    ; 

resourceDeclaration 
    : Resource Identifier String 
    ; 

task 
    : 
    Task Identifier String OpenParen 
    (task)* 
    (Start DateTimeWithTimeZone 
    End DateTimeWithTimeZone 
    Scheduling Asap 
    Scheduled)* 
    CloseParen 
    ; 

/* (Complete FloatingPointNumber)* */ 

supplementTask returns [DefaultSupplementStatement suppStmt] 
    : 
     { 
      suppStmt = new DefaultSupplementStatement(); 
     } 
    Supplement Task taskId=Identifier {suppStmt.setTaskId($taskId.text); } 
    OpenParen 
    (
    bStmt=booking {suppStmt.addBookingStatement($bStmt.stmt); } 
    )* 
    Priority IntegerNumber 
    ProjectIdPrj 
    CloseParen 
    ; 

supplementResource 
    : 
    Supplement Resource Identifier OpenParen 
    workinghours+ 
    CloseParen 
    ; 

workinghours 
    : 
    Workinghours DayOfWeek (Off|workingIntervals) 
    ; 

Workinghours 
    : 'workinghours' 
    ; 

workingIntervals 
    : 
    workingInterval (Comma workingInterval)* 
    ; 

workingInterval 
    : Time Hyphen Time 
    ; 

Time 
    : IntegerNumber Colon IntegerNumber 
    ; 

Colon 
    : 
    ':' 
    ; 

Comma 
    : 
    ',' 
    ; 

DayOfWeek 
    : 'mon' 
    | 'tue' 
    | 'wed' 
    | 'thu' 
    | 'fri' 
    | 'sat' 
    | 'sun' 
    ; 

Off 
    : 
    'off' 
    ; 

booking returns [DefaultBookingStatement stmt] 
    : 
    { 
     stmt = new DefaultBookingStatement(); 
    } 
    Booking resource=Identifier { stmt.setResource($resource.text); } 
    bt1=bookingTime { stmt.addIndBooking($bt1.indBooking); } 
    (Comma 
    bt2=bookingTime { stmt.addIndBooking($bt2.indBooking); } 
    )* 
    (OpenParen 
    overtime 
    CloseParen) 
    ; 

bookingTime returns [DefaultIndBooking indBooking] 
    : 
    startTime=DateTimeWithTimeZone 
    Plus 
    bookingDuration=FloatingPointNumberDuration 
    { 
     $indBooking = new DefaultIndBooking($startTime.text, $bookingDuration.text); 
    } 
    ; 

ProjectIdPrj 
    : 
    'projectid prj' 
    ; 

Booking 
    : 
    'booking' 
    ; 

Plus 
    : 
    '+' 
    ; 

duration 
    : 
    FloatingPointNumber 'h' 
    ; 

overtime 
    : 
    Overtime IntegerNumber 
    ; 

Overtime 
    : 
    'overtime' 
    ; 

Supplement 
    : 
    'supplement' 
    ; 

Priority 
    : 
    'priority' 
    ; 

Complete 
    : 
    'complete' 
    ; 

Start 
    : 
    'start' 
    ; 

End 
    : 
    'end' 
    ; 

Scheduling 
    : 
    'scheduling' 
    ; 

Asap 
    : 
    'asap' 
    ; 

Scheduled 
    : 
    'scheduled' 
    ; 

Task 
    : 
    'task' 
    ; 

Resource 
    : 
    'resource' 
    ; 

Projectids 
    : 
    'projectids' 
    ; 

Project 
    : 'project' 
    ; 

Prj 
    : 'prj' 
    ; 

OpenParen 
    : '{' 
    ; 

CloseParen 
    : '}' 
    ; 

Hyphen 
    : '-' 
    ; 

FloatingPointNumber 
    : D+'.'D+ 
    ; 
FloatingPointNumberDuration 
    : D+ P D+ H 
    ; 

IntegerNumber 
    : D+ 
    ; 

Identifier 
    : (D|A|P)+; 

String 
    : '"' ~'"'* '"' 
    ; 

DateTimeWithTimeZone 
    : D D D D '-' D D '-' D D '-' D D ':' D D '-+' D D D D 
    ; 

fragment  
D 
    : '0'..'9' 
    ; 

fragment 
A 
    : 'A'..'Z' 
    | 'a'..'z' 
    ; 

fragment 
P 
    : '.' 
    ; 

fragment 
H 
    : 'h' 
    ; 


Space 
    : (' ' | '\t' | '\r'? '\n'){$channel=HIDDEN;} 
    ; 
+0

一种方法来调试这样的问题,请参见[这里] [1] [1]:HTTP:/ /stackoverflow.com/a/22656728/17876 – idrosid

+0

您可以通过询问SSCCE来提高您的问题质量:http://www.sscce.org/ –

回答

2

您的令牌'"pcc"''"R"''"Doll"''"Train"''"Ball"'的所有都标记化作为String的,但作为Utc令牌,使他们不能在该期望String令牌你的生产(解析器)的规则。

此外,您的supplementTask规则是错误的。它看起来像:

supplementTask 
    : Supplement Task Identifier 
    OpenParen 
    booking* 
    Priority IntegerNumber 
    CloseParen 
    ; 

但您输入的样子:

supplement task T1 { 
    booking R62 2011-09-05-14:00-+0000 + 2.0h { overtime 2 } 
    priority 997 
    projectid prj 
} 

例如,您PriorityIntegerNumber令牌后,没有CloseParen,但有源"projectid prj"

仅供参考,这里是你的词法分析器产生凭证清单:

Project         project 
Prj          prj 
Utc          "pcc" 
String         "1.0" 
DateTimeWithTimeZone      2011-09-04-00:00-+0000 
Hyphen         - 
DateTimeWithTimeZone      2011-10-04-10:00-+0000 
OpenParen        { 
TimeZone         timezone 
Utc          "UTC" 
ScenarioPart1       scenario plan "Plan" 
OpenParen        { 
ScenarioPart2       active yes 
CloseParen        } 
CloseParen        } 
Projectids        projectids 
Prj          prj 
Resource         resource 
Identifier        R62 
Utc          "R" 
Task          task 
Identifier        T1 
Utc          "Doll" 
OpenParen        { 
Start         start 
DateTimeWithTimeZone      2011-09-05-14:00-+0000 
End          end 
DateTimeWithTimeZone      2011-09-05-16:00-+0000 
Scheduling        scheduling 
Asap          asap 
Scheduled        scheduled 
CloseParen        } 
Task          task 
Identifier        T2 
Utc          "Train" 
OpenParen        { 
Start         start 
DateTimeWithTimeZone      2011-09-05-11:00-+0000 
End          end 
DateTimeWithTimeZone      2011-09-05-14:00-+0000 
Scheduling        scheduling 
Asap          asap 
Scheduled        scheduled 
CloseParen        } 
Task          task 
Identifier        T4 
Utc          "Ball" 
OpenParen        { 
Task          task 
Identifier        T3 
String         "Big ball" 
OpenParen        { 
Start         start 
DateTimeWithTimeZone      2011-09-05-09:00-+0000 
End          end 
DateTimeWithTimeZone      2011-09-05-11:00-+0000 
Scheduling        scheduling 
Asap          asap 
Scheduled        scheduled 
CloseParen        } 
Task          task 
Identifier        T5 
String         "Small ball" 
OpenParen        { 
Start         start 
DateTimeWithTimeZone      2011-09-05-16:00-+0000 
End          end 
DateTimeWithTimeZone      2011-09-05-17:00-+0000 
Scheduling        scheduling 
Asap          asap 
Scheduled        scheduled 
CloseParen        } 
CloseParen        } 
Supplement        supplement 
Task          task 
Identifier        T1 
OpenParen        { 
Booking         booking 
Identifier        R62 
DateTimeWithTimeZone      2011-09-05-14:00-+0000 
Plus          + 
FloatingPointNumberDuration    2.0h 
OpenParen        { 
Overtime         overtime 
IntegerNumber       2 
CloseParen        } 
Priority         priority 
IntegerNumber       997 
Identifier        projectid 
Prj          prj 
CloseParen        } 
Supplement        supplement 
Task          task 
Identifier        T2 
OpenParen        { 
Booking         booking 
Identifier        R62 
DateTimeWithTimeZone      2011-09-05-11:00-+0000 
Plus          + 
FloatingPointNumberDuration    3.0h 
OpenParen        { 
Overtime         overtime 
IntegerNumber       2 
CloseParen        } 
Priority         priority 
IntegerNumber       998 
Identifier        projectid 
Prj          prj 
CloseParen        } 
Supplement        supplement 
Task          task 
Identifier        T4 
OpenParen        { 
Priority         priority 
IntegerNumber       0 
Identifier        projectid 
Prj          prj 
CloseParen        } 
Supplement        supplement 
Task          task 
Identifier        T4.T3 
OpenParen        { 
Booking         booking 
Identifier        R62 
DateTimeWithTimeZone      2011-09-05-09:00-+0000 
Plus          + 
FloatingPointNumberDuration    2.0h 
OpenParen        { 
Overtime         overtime 
IntegerNumber       2 
CloseParen        } 
Priority         priority 
IntegerNumber       1000 
Identifier        projectid 
Prj          prj 
CloseParen        } 
Supplement        supplement 
Task          task 
Identifier        T4.T5 
OpenParen        { 
Booking         booking 
Identifier        R62 
DateTimeWithTimeZone      2011-09-05-16:00-+0000 
Plus          + 
FloatingPointNumberDuration    1.0h 
OpenParen        { 
Overtime         overtime 
IntegerNumber       2 
CloseParen        } 
Priority         priority 
IntegerNumber       996 
Identifier        projectid 
Prj          prj 
CloseParen        } 
Supplement        supplement 
Resource         resource 
Identifier        R62 
OpenParen        { 
Workinghours        workinghours 
DayOfWeek        sun 
Off          off 
Workinghours        workinghours 
DayOfWeek        mon 
Time          9:00 
Hyphen         - 
Time          17:00 
Workinghours        workinghours 
DayOfWeek        tue 
Time          9:00 
Hyphen         - 
Time          17:00 
Workinghours        workinghours 
DayOfWeek        wed 
Time          9:00 
Hyphen         - 
Time          17:00 
Workinghours        workinghours 
DayOfWeek        thu 
Time          9:00 
Hyphen         - 
Time          17:00 
Workinghours        workinghours 
DayOfWeek        fri 
Time          9:00 
Hyphen         - 
Time          17:00 
Workinghours        workinghours 
DayOfWeek        sat 
Off          off 
CloseParen        }
+0

谢谢。我纠正了这个文件,现在它工作。 –

+0

@Dmitri,不客气。 –