Parsing 如何使用antlr4分析.aidl文件的语法?
实际上,我的任务是分析.aidl文件的语法,并使用侦听器方法提取语法元素 为了完成这项工作,我想了很久,最后我设计了一个.g4文件Parsing 如何使用antlr4分析.aidl文件的语法?,parsing,antlr,antlr4,lexer,aidl,Parsing,Antlr,Antlr4,Lexer,Aidl,实际上,我的任务是分析.aidl文件的语法,并使用侦听器方法提取语法元素 为了完成这项工作,我想了很久,最后我设计了一个.g4文件 grammar aidl3; file : pack* imp* parcelable? interfa? ; pack : 'package' WS+ PAC_NAME WS* ';' WS* ; imp : 'import' WS+ IMP_NAME WS* ';' WS* ; parcelable : 'parcelable' WS+ PARC
grammar aidl3;
file : pack* imp* parcelable? interfa? ;
pack : 'package' WS+ PAC_NAME WS* ';' WS* ;
imp : 'import' WS+ IMP_NAME WS* ';' WS* ;
parcelable : 'parcelable' WS+ PARCE_NAME WS* ';' WS* ;
interfa : INTER_TAG? WS* 'interface' WS+ INTER_NAME WS* '{' WS* methods+ WS* '}' WS*;
methods : RETURN_TYPE WS+ METHOD_NAME WS* '(' WS* argmentsa* WS* argmentsb* WS* ')' WS* ';' WS* ;
argmentsa : TAG? WS* ARG_TYPE WS+ ARG_NAME WS* ',' WS* ;
argmentsb : TAG? WS* ARG_TYPE WS+ ARG_NAME WS* ;
PAC_NAME : ~[; \n\r]+ ;
//PAC_NAME : [_a-zA-Z] [_.a-zA-Z0-9]* ;
IMP_NAME : ~[ ;\n\r]+ ;
PARCE_NAME : ~[ ;\n\r.]+ ;
INTER_TAG : 'oneway';
INTER_NAME : ~[ ;\n\r{.]+ ;
RETURN_TYPE : ~[ ;\n\r.]+ ;
METHOD_NAME : ~[ ;\n\r(]+ ;
TAG : 'in' | 'out' | 'inout' ;
//ARG_TYPE : ~[) ,\n\r]+ ;
ARG_TYPE : [a-zA-Z] ~' '* | [a-zA-Z] ~' '* ' ' '[' ']' ;
ARG_NAME : ~[ ,\n\r).]+ ;
WS: [ \t\n\r];
然而,我遇到了一个奇怪的问题:那就是当我试图分析.aidl文件时
package android.view.accessibility;
oneway interface IAccessibilityInteractionConnection {
void findAccessibilityNodeInfoByAccessibilityId(long accessibilityNodeId, in Region bounds,
int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags,
int interrogatingPid, long interrogatingTid, in MagnificationSpec spec);
void findAccessibilityNodeInfosByViewId(long accessibilityNodeId, String viewId,
in Region bounds, int interactionId, IAccessibilityInteractionConnectionCallback callback,
int flags, int interrogatingPid, long interrogatingTid, in MagnificationSpec spec);
void findAccessibilityNodeInfosByText(long accessibilityNodeId, String text, in Region bounds,
int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags,
int interrogatingPid, long interrogatingTid, in MagnificationSpec spec);
void findFocus(long accessibilityNodeId, int focusType, in Region bounds, int interactionId,
IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid,
long interrogatingTid, in MagnificationSpec spec);
void focusSearch(long accessibilityNodeId, int direction, in Region bounds, int interactionId,
IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid,
long interrogatingTid, in MagnificationSpec spec);
void performAccessibilityAction(long accessibilityNodeId, int action, in Bundle arguments,
int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags,
int interrogatingPid, long interrogatingTid);
}
它将提供以下输出:
[@0,0:6='package',<'package'>,1:0]
[@1,7:7=' ',<WS>,1:7]
[@2,8:41='android.view.accessibility;\noneway',<ARG_TYPE>,1:8]
[@3,42:42=' ',<WS>,2:6]
[@4,43:51='interface',<'interface'>,2:7]
[@5,52:52=' ',<WS>,2:16]
[@6,53:87='IAccessibilityInteractionConnection',<PAC_NAME>,2:17]
[@7,88:88=' ',<WS>,2:52]
[@8,89:89='{',<'{'>,2:53]
[@9,90:90='\n',<WS>,2:54]
[@10,91:91=' ',<WS>,3:0]
[@11,92:92=' ',<WS>,3:1]
[@12,93:93=' ',<WS>,3:2]
[@13,94:94=' ',<WS>,3:3]
[@14,95:98='void',<PAC_NAME>,3:4]
[@15,99:99=' ',<WS>,3:8]
[@16,100:146='findAccessibilityNodeInfoByAccessibilityId(long',<PAC_NAME>,3:9]
[@17,147:147=' ',<WS>,3:56]
[@18,148:167='accessibilityNodeId,',<PAC_NAME>,3:57]
...
[@0,0:6='package',1:0]
[@1,7:7=' ',,1:7]
[@2,8:41='android.view.accessibility;\noneway',1:8]
[@3,42:42=' ',,2:6]
[@4,43:51='interface',2:7]
[@5,52:52=' ',,2:16]
[@6,53:87='IAccessibilityInteractionConnection',2:17]
[@7,88:88=' ',,2:52]
[@8,89:89='{',,2:53]
[@9,90:90='\n',2:54]
[@10,91:91=' ',,3:0]
[@11,92:92=' ',,3:1]
[@12,93:93=' ',,3:2]
[@13,94:94=' ',,3:3]
[@14,95:98='void',3:4]
[@15,99:99=' ',,3:8]
[@16100:146='findAccessibilityNodeInfoByAccessibilityId(long',3:9]
[@17,147:147=' ',,3:56]
[@18148:167='accessibilityNodeId',,3:57]
...
您可以在输出行3中看到“[@2,8:41='android.view.accessibility;\noneway',ARG_TYPE,1:8]”,其中表达式“pack”使用“ARG_TYPE”来匹配“android.view.accessibility;\noneway”。但是..怎么可能?'ARG_TYPE'从未出现在表达式“pack”中,它应该使用“PAC_NAME”来匹配“android.view.accessibility”'
如果有人能帮我弄清楚这件事,那就太好了,因为我正面临着一个紧迫的最后期限。
事实上,我只是一个新的学习者,我知道我的g4文件看起来不太好,所以如果可能的话,你能告诉我如何更好地为.aidl编写g4吗?或者甚至告诉我书面答案
如果您能帮助我,我将不胜感激!谢谢!ANTLR的lexer尝试使用尽可能多的字符创建令牌。而且由于
ARG\u TYPE
能够匹配android.view.accessibility;\noway
(没有其他规则可以匹配更多字符),将创建一个ARG_TYPE
标记。只有当两个或多个规则匹配相同的字符时,ANTLR才会选择首先定义的一个
您必须了解,lexer不会根据解析器试图匹配的内容创建标记。标记化是一个独立于解析阶段的过程。因此,看起来像~[;\n\r(+]+
的大多数规则过于宽泛
我建议您看看,并使用它来处理AIDL文件
编辑
如果我使用上面发布的语法文件,并更改:
formalParameter
: variableModifier* unannType variableDeclaratorId
;
interfaceModifier
: annotation
| 'public'
| 'protected'
| 'private'
| 'abstract'
| 'static'
| 'strictfp'
;
进入:
和变化:
formalParameter
: variableModifier* unannType variableDeclaratorId
;
interfaceModifier
: annotation
| 'public'
| 'protected'
| 'private'
| 'abstract'
| 'static'
| 'strictfp'
;
进入:
然后您的示例文件将正确解析。欢迎使用StackOverflow。您可以指定如何调用antlr4吗?我无法复制您得到的输出。我可以复制它。