Antlr4 如何使用ANTLRv4解析一些C语言块注释(格式良好)
我需要使用下面的格式化块注释来搜索C源代码。 我想提取这些文件:“abcd”、“filedname1”、“attr1”、“attr2”、“filedname2”、“attr1”、“attr2” 我已经编写了一个如下所示的gramma文件,但是它的“BlockComment”无法获得正常的块注释,我仍然不确定gramma文件是否正确? 任何人都可以帮助我,谢谢Antlr4 如何使用ANTLRv4解析一些C语言块注释(格式良好),antlr4,Antlr4,我需要使用下面的格式化块注释来搜索C源代码。 我想提取这些文件:“abcd”、“filedname1”、“attr1”、“attr2”、“filedname2”、“attr1”、“attr2” 我已经编写了一个如下所示的gramma文件,但是它的“BlockComment”无法获得正常的块注释,我仍然不确定gramma文件是否正确? 任何人都可以帮助我,谢谢 /* *| abcd { *| .filename1 *| { *| :attr1= define; *| :attr2=
/*
*| abcd {
*| .filename1
*| {
*| :attr1= define;
*| :attr2= "Cell#";
*| }
*| .filename2
*| {
*| :attr1= define;
*| :attr2= "Cell#";
*| }
*| }
*/
gramma文件爆炸:
语法定义
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
;
语法定义;
caldefBodyList
:caldefBody
;
卡尔德福评论
:CaldefCommentStart CaldefLineStart标识符LeftBrace caldefBodyList CalDefense1*CaldefCommentEnd
;
卡尔德伯德
:CaldefLineStart标识符CaldefLineStart LeftBrace caldefFiledBodyList caldefens1
;
caldefFiledBodyList
:caldefFiledBody
|caldefFiledBodyList caldefFiledBody
;
caldefFiledBody
:CaldefLineStart空白?冒号标识符“;”
|CaldefLineStart空白?冒号标识符赋值运算符StringLiteral+';'
|CaldefLineStart空白?冒号标识符赋值运算符标识符“;”
;
赋值运算符
: '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '=' | '&=' | '^=' | '|='
;
区块评论
:'/*'[\r\t]*?'\n'~[*.].*?'*/'
;
卡尔德福酒店
:“/*”[\r\t]*?“\n”
;
加州大学1
:“*|”[\t]*?“}”
;
卡尔德芬德
: '*/'
;
CaldefLineStart
: '*|'
;
线条注释
:“/”~[\r\n]*
->跳过
;
StringLiteral
:编码前缀?““SCharSequence?”
;
片段
编码前缀
:“u8”
|“你”
|“你”
|“我
;
片段
SCharSequence
:沙尔+
;
片段
沙尔
:~[“\\\r\n]
|逃逸序列
;
片段
逃逸序列
:simplescapesequence
|八角序列
|十六进制序列
|通用字符名
;
片段
simplescape序列
:“\\”[“?abfnrtv\\]
;
片段
八角序列
:“\\”八进制数字
|'\\'八达尔迪吉特八达尔迪吉特
|“\\”八达尔吉特八达尔吉特八达尔吉特八达尔吉特
;
片段
十六进制序列
:“\\x”十六进制数字+
;
片段
二元常数
:“0”[bB][0-1]+
;
片段
小数常数
:非零位数字*
;
片段
八进制常数
:“0”八进制数字*
;
片段
十六进制常数
:十六进制数字+
;
片段
十六进制
:“0”[xX]
;
片段
非零位
: [1-9]
;
片段
八重晶石
: [0-7]
;
片段
十六进制数字
:[0-9a-fA-F]
;
空白
:[\r\t]+
->跳过
;
左括号:'(';
右括号:')';
左括号:'[';
右括号:']';
左括号:“{”;
右括号:'}';
问题:“?”;
冒号:':';
半:';';
逗号:',';
新线
:('\r'\n'?
|“\n”
)
->跳过
;
标识符
:IdentifierOnDigit
(识别号)
|数字
)*
;
片段
鉴定人
:非数字
|通用字符名
| '.'
//|//其他实现定义的字符。。。
;
片段
非数字
:[a-zA-Z_]
;
片段
数字
: [0-9]
;
片段
通用字符名
:“\\u”HexQuad
|'\\U'六边形六边形六边形
;
片段
六方
:十六进制数字十六进制数字十六进制数字十六进制数字十六进制数字
;
你已经尝试过什么了吗?做的不多。因为我的格式化注释都以“/*\n*|”开头,所以我想放弃普通的块注释并提取格式化注释。我不确定这行不行?