Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 如何使用antlr4分析.aidl文件的语法?_Parsing_Antlr_Antlr4_Lexer_Aidl - Fatal编程技术网

Parsing 如何使用antlr4分析.aidl文件的语法?

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

实际上,我的任务是分析.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+  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吗?我无法复制您得到的输出。我可以复制它。