我需要使用如下所示的格式化块注释来增加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
;