Antlr解析与令牌和标识符的冲突

时间:2014-04-05 13:01:13

标签: antlr3

我正在尝试解析自由格式字符串(ANTLR 3)并遇到字符串/令牌问题。谷歌搜索还没有帮助我。这是我的语法:

grammar TestHeader;

options {
    language  = Java;
    output    = AST;
}

tokens {
    STOKEN_1 = 'SENDTO';
    STOKEN_2 = 'SRCSYS';
    STOKEN_3 = 'SOFTERROR';
}

@lexer::header {
package com.sample.parser;
}

@parser::header {
package com.sample.parser;
}

fragment TAG : /* empty rule: only used to change the 'type' */;

fragment CR:  '\r';
fragment LF: '\n';
fragment SLASH: '/';
fragment HASH: '#';
fragment DIGIT: '0'..'9';
fragment SEMI_COLON: ';';

COLON: ':';
COMMA: ',';
DOT: '.';
LETTER: 'A'..'Z' | 'a'..'z';
HYPHEN: '-';
BRANCH_CHARS: '$' | '@' | HASH;
SPACE: (' ');
EOL: (CR? LF) | CR | SEMI_COLON;
DATE: ('0'..'1')? DIGIT SLASH ('0'..'3')? DIGIT SLASH DIGIT DIGIT;
TIME: ('0'..'2')? DIGIT COLON ('0'..'5')? DIGIT (COLON '0'..'5' DIGIT)?;

DECIMAL
    :
    DIGIT* ('.' DIGIT*)
    {
      if ($text.contains("/")) {
        $type = DATE;
      } else if ($text.contains(":")) {
        $type = TIME;
      }
    }
    ;

NUMBER
    :
    '0'..'9' DIGIT*
    {
      if ($text.contains("/")) {
        $type = DATE;
      } else if ($text.contains(":")) {
        $type = TIME;
      }
    }
    ;

SINGLELINE_COMMENT
    :
      '//-' ~('\r' | '\n')*
    ;

header
    :
        (word SPACE+ sequenceNumber SPACE+ type) EOL+
        (SPACE* trailer) EOL+
    ;

word
    :
      (data += ~(SPACE))+
    ;

sequenceNumber
    :
    nn=NUMBER
    ;

type
    :
    LETTER
    ;

trailer
    :
//      (tt += ~(EOL ))*
        SINGLELINE_COMMENT
    ;

使用测试输入

SY 260 O
//-$CJ******1

我得到以下

 0 null
-- 16 S
-- 16 Y
-- 22  
-- 18 260
-- 22  
-- 16 O
-- 13 

-- 20 //-$CJ******1
-- 13 

但是输入以下内容

SR 260 O
//-$CJ******1

我得到了

line 1:2 mismatched character ' ' expecting 'C'
line 1:7 mismatched input 'O' expecting NUMBER
 0 260 O
//-$CJ******1

我哪里错了?有任何提示/帮助来解决这个问题吗?

0 个答案:

没有答案