ANTLR:无关输入问题

ANTLR:无关输入问题,antlr,Antlr,我有一个语法文件Bookings.g和我试图用该语法解析的文件 为什么我会犯这些错误 第1行:12外部输入“pcc”应为字符串 第3行:0不匹配的输入“}”,应为ScenarioPart1 第7行:13不匹配的输入“R”应为字符串 第9行:8不匹配的输入“Doll”应为字符串 第15行:8不匹配的输入“Train”应为字符串 第21行:8不匹配的输入“Ball”应为字符串 第34行:“}”处缺少EOF 语法 grammar Bookings; @members { private De

我有一个语法文件Bookings.g和我试图用该语法解析的文件

为什么我会犯这些错误

第1行:12外部输入“pcc”应为字符串 第3行:0不匹配的输入“}”,应为ScenarioPart1 第7行:13不匹配的输入“R”应为字符串 第9行:8不匹配的输入“Doll”应为字符串 第15行:8不匹配的输入“Train”应为字符串 第21行:8不匹配的输入“Ball”应为字符串 第34行:“}”处缺少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,05.09.2011 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;}
  ;
您的所有令牌
'“pcc”
'“R”
'“Doll”
'“Train”
'“Ball”
都没有标记为
字符串,而是标记为
Utc
令牌,这导致它们无法满足预期
字符串
令牌的生产(解析器)规则

另外,您的
补充任务
规则是错误的。它看起来像:

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
}
然而,您的输入看起来像:

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
}
例如,在您的
优先级
整数编号
标记之后,没有
关闭密码
,但有源
“projectd prj”

仅供参考,以下是lexer生产的代币列表:

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 } 工程项目 Prj Prj Utc“pcc” 字符串“1.0” DateTimeWithTimeZone 2011-09-04-00:00-+0000 连字符- DateTimeWithTimeZone 2011-10-04-10:00-+0000 OpenParen{ 时区时区 Utc“Utc” 场景第1部分场景计划“计划” OpenParen{ 场景第2部分活动是 CloseParen} CloseParen} 射影射影 Prj Prj 资源 标识符R62 Utc“R” 任务 标识符T1 Utc“娃娃” OpenParen{ 开始 DateTimeWithTimeZone 2011-09-05-14:00-+0000 结束 DateTimeWithTimeZone 2011-09-05-16:00-+0000 排程 尽快 预定 CloseParen} 任务 标识符T2 Utc“列车” OpenParen{ 开始 DateTimeWithTimeZone 2011-09-05-11:00-+0000 结束 DateTimeWithTimeZone 2011-09-05-14:00-+0000 排程 尽快 预定 CloseParen} 任务 标识符T4 Utc“球” OpenParen{ 任务 标识符T3 串“大球” OpenParen{ 开始 DateTimeWithTimeZone 2011-09-05-09:00-+0000 结束 DateTimeWithTimeZone 2011-09-05-11:00-+0000 排程 尽快 预定 CloseParen} 任务 标识符T5 弦“小球” OpenParen{ 开始 DateTimeWithTimeZone 2011-09-05-16:00-+0000 结束 DateTimeWithTimeZone 2011-09-05-17:00-+0000 排程 尽快 预定 CloseParen} CloseParen} 补充资料 任务 标识符T1 OpenParen{ 预订 标识符R62 DateTimeWithTimeZone 2011-09-05-14:00-+0000 加上+ 浮点数持续时间2.0h OpenParen{ 加班 整数2 CloseParen} 优先权 整数997 标识符投影 Prj Prj CloseParen} 补充资料 任务 标识符T2 OpenParen{ 预订 标识符