如何使用ANTLRv4解析一些C语言块注释(具有良好的格式)

时间:2016-01-22 02:59:26

标签: antlr4

我需要使用如下所示的格式化块注释来增加C源代码。 我想提取那些文件:“abcd”,“filedname1”,“attr1”,“attr2”,“filedname2”,“attr1”,“attr2”。

我写了一个像下面这样的语法文件,但它的“BlockComment”无法获得正常的块注释,但我还不确定语法文件是否正确? 任何人都可以帮助我,谢谢!

/*
*| abcd {
*|  .filename1
*|  {
*|    :attr1= define;
*|    :attr2= "Cell#";
*|  }
*|  .filename2
*|  {
*|    :attr1= define;
*|    :attr2= "Cell#";
*|  }
*| }
*/

语法文件打击: 语法caldef;

grammar caldef;
caldefBodyList
    : caldefBody
    ;

caldefComment
    :  CaldefCommentStart CaldefLineStart Identifier LeftBrace caldefBodyList CaldefEnd1* CaldefCommentEnd
    ;

caldefBody
    : CaldefLineStart  Identifier CaldefLineStart LeftBrace caldefFiledBodyList CaldefEnd1
    ;

caldefFiledBodyList
    : caldefFiledBody
    | caldefFiledBodyList caldefFiledBody
    ;

caldefFiledBody
    : CaldefLineStart Whitespace? Colon Identifier ';'
    | CaldefLineStart Whitespace? Colon Identifier assignmentOperator StringLiteral+';'
    | CaldefLineStart Whitespace? Colon Identifier assignmentOperator Identifier';'
    ;

assignmentOperator
    :   '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|='
    ;
BlockComment
    :  '/*'[ \r\t]*?'\n'~[*|].*? '*/'
    ;

CaldefCommentStart
    :  '/*'[ \r\t]*?'\n'
    ;

CaldefEnd1
        : '*|'[ \t]*?'}'
        ;

CaldefCommentEnd
    : '*/'
    ;

CaldefLineStart
    : '*|'
    ;

LineComment
    :   '//' ~[\r\n]*
        -> skip
    ;
StringLiteral
    :   EncodingPrefix? '"' SCharSequence? '"'
    ;
    fragment
EncodingPrefix
    :   'u8'
    |   'u'
    |   'U'
    |   'L'
    ;

fragment
SCharSequence
    :   SChar+
    ;
    fragment
SChar
    :   ~["\\\r\n]
    |   EscapeSequence
    ;
fragment
EscapeSequence
    :   SimpleEscapeSequence
    |   OctalEscapeSequence
    |   HexadecimalEscapeSequence
    |   UniversalCharacterName
    ;

fragment
SimpleEscapeSequence
    :   '\\' ['"?abfnrtv\\]
    ;

fragment
OctalEscapeSequence
    :   '\\' OctalDigit
    |   '\\' OctalDigit OctalDigit
    |   '\\' OctalDigit OctalDigit OctalDigit
    ;

fragment
HexadecimalEscapeSequence
    :   '\\x' HexadecimalDigit+
    ;
fragment
BinaryConstant
    :   '0' [bB] [0-1]+
    ;

fragment
DecimalConstant
    :   NonzeroDigit Digit*
    ;

fragment
OctalConstant
    :   '0' OctalDigit*
    ;

fragment
HexadecimalConstant
    :   HexadecimalPrefix HexadecimalDigit+
    ;

fragment
HexadecimalPrefix
    :   '0' [xX]
    ;

fragment
NonzeroDigit
    :   [1-9]
    ;

fragment
OctalDigit
    :   [0-7]
    ;

fragment
HexadecimalDigit
    :   [0-9a-fA-F]
    ;

Whitespace
    :   [ \r\t]+
        -> skip
    ;
LeftParen : '(';
RightParen : ')';
LeftBracket : '[';
RightBracket : ']';
LeftBrace : '{';
RightBrace : '}';
Question : '?';
Colon : ':';
Semi : ';';
Comma : ',';
Newline
    :   (   '\r' '\n'?
        |   '\n'
        )
        -> skip
    ;

Identifier
    :   IdentifierNondigit
        (   IdentifierNondigit
        |   Digit
        )*
    ;

fragment
IdentifierNondigit
    :   Nondigit
    |   UniversalCharacterName
    |   '.'
    //|   // other implementation-defined characters...
    ;

fragment
Nondigit
    :   [a-zA-Z_]
    ;

fragment
Digit
    :   [0-9]
    ;

fragment
UniversalCharacterName
    :   '\\u' HexQuad
    |   '\\U' HexQuad HexQuad
    ;

fragment
HexQuad
    :   HexadecimalDigit HexadecimalDigit HexadecimalDigit HexadecimalDigit
    ;

gramma file genenrate tree

0 个答案:

没有答案