在XPath中访问注释和/或TRIVIA文件

时间:2014-03-05 10:47:19

标签: xpath abstract-syntax-tree sonarqube

我使用XPath遇到了一些麻烦。 (后来我想在SonarQube上添加我的表达式来规则xpath模式,这样我就可以在那里创建自己的规则了。但是还不需要SonarQube)

我想创建一个规则,如果分析了一个项目,并且在我的java项目的注释(例如“ERROR”)中写了一些特殊内容(例如myXPathTry.java),则会抛出异常。

我正在使用此SSLR Toolkit测试我的所有表达式。只需要下载并执行它。

用法很简单:在左侧添加代码,单击框下方的“解析源代码”。然后在底部的框中​​添加xpath规则,最后单击“Evaluate XPath”。结果应该标记。如果单击右侧框上方的xml按钮,也可以查看源代码的自动创建XML。

我的问题是:所有评论都保存在“无法访问”的TRIVIA路径中(如您在AST中所见)。我可以访问所有其他的东西并检查那里的值和参数,但不是这个TRIVIA的东西。 (JavaCode,AST(抽象语法树)和XML在下面添加。)

您知道如何获取评论的方式吗? 谢谢你的帮助! :)

Already tested: 
neighter //*/comment() , nor //*/TOKEN/TRIVIA does have any effect. 
//*/TOKEN works and has affect, but does not contain the needed information.

Java代码:

public class MyXPathTry{
    public static void main(String[] args){
    System.out.println("Just to have some code");
        //This is a comment
        /* This is a second comment */
        /* This is a second comment with ERROR*/
    }
}

AST-Image

在AST中,点击工具包左侧的任何注释后,选择蓝线(RWING,如果图像不可见)。默认情况下,路径向下没有打开。我自己打开了RWING和TOKEN子文件夹,只是告诉你我对TRIVIA文件的意思)

Toolkit Auto-Created XML:
<compilationUnit tokenValue="public" tokenLine="1" tokenColumn="0">
  <typeDeclaration tokenValue="public" tokenLine="1" tokenColumn="0">
    <modifier tokenValue="public" tokenLine="1" tokenColumn="0">
      <PUBLIC tokenValue="public" tokenLine="1" tokenColumn="0">
        <TOKEN tokenValue="public" tokenLine="1" tokenColumn="0"/>
      </PUBLIC>
    </modifier>
    <classDeclaration tokenValue="class" tokenLine="1" tokenColumn="7">
      <CLASS tokenValue="class" tokenLine="1" tokenColumn="7">
        <TOKEN tokenValue="class" tokenLine="1" tokenColumn="7"/>
      </CLASS>
      <IDENTIFIER tokenValue="MyXPathTry" tokenLine="1" tokenColumn="13">
        <TOKEN tokenValue="MyXPathTry" tokenLine="1" tokenColumn="13"/>
      </IDENTIFIER>
      <classBody tokenValue="{" tokenLine="1" tokenColumn="23">
        <LWING tokenValue="{" tokenLine="1" tokenColumn="23">
          <TOKEN tokenValue="{" tokenLine="1" tokenColumn="23"/>
        </LWING>
        <classBodyDeclaration tokenValue="public" tokenLine="2" tokenColumn="4">
          <modifier tokenValue="public" tokenLine="2" tokenColumn="4">
            <PUBLIC tokenValue="public" tokenLine="2" tokenColumn="4">
              <TOKEN tokenValue="public" tokenLine="2" tokenColumn="4"/>
            </PUBLIC>
          </modifier>
          <modifier tokenValue="static" tokenLine="2" tokenColumn="11">
            <STATIC tokenValue="static" tokenLine="2" tokenColumn="11">
              <TOKEN tokenValue="static" tokenLine="2" tokenColumn="11"/>
            </STATIC>
          </modifier>
          <memberDecl tokenValue="void" tokenLine="2" tokenColumn="18">
            <VOID tokenValue="void" tokenLine="2" tokenColumn="18">
              <TOKEN tokenValue="void" tokenLine="2" tokenColumn="18"/>
            </VOID>
            <IDENTIFIER tokenValue="main" tokenLine="2" tokenColumn="23">
              <TOKEN tokenValue="main" tokenLine="2" tokenColumn="23"/>
            </IDENTIFIER>
            <voidMethodDeclaratorRest tokenValue="(" tokenLine="2" tokenColumn="27">
              <formalParameters tokenValue="(" tokenLine="2" tokenColumn="27">
                <LPAR tokenValue="(" tokenLine="2" tokenColumn="27">
                  <TOKEN tokenValue="(" tokenLine="2" tokenColumn="27"/>
                </LPAR>
                <formalParameterDecls tokenValue="String" tokenLine="2" tokenColumn="28">
                  <type tokenValue="String" tokenLine="2" tokenColumn="28">
                    <classType tokenValue="String" tokenLine="2" tokenColumn="28">
                      <IDENTIFIER tokenValue="String" tokenLine="2" tokenColumn="28">
                        <TOKEN tokenValue="String" tokenLine="2" tokenColumn="28"/>
                      </IDENTIFIER>
                    </classType>
                    <dim tokenValue="[" tokenLine="2" tokenColumn="34">
                      <LBRK tokenValue="[" tokenLine="2" tokenColumn="34">
                        <TOKEN tokenValue="[" tokenLine="2" tokenColumn="34"/>
                      </LBRK>
                      <RBRK tokenValue="]" tokenLine="2" tokenColumn="35">
                        <TOKEN tokenValue="]" tokenLine="2" tokenColumn="35"/>
                      </RBRK>
                    </dim>
                  </type>
                  <formalParametersDeclsRest tokenValue="args" tokenLine="2" tokenColumn="37">
                    <variableDeclaratorId tokenValue="args" tokenLine="2" tokenColumn="37">
                      <IDENTIFIER tokenValue="args" tokenLine="2" tokenColumn="37">
                        <TOKEN tokenValue="args" tokenLine="2" tokenColumn="37"/>
                      </IDENTIFIER>
                    </variableDeclaratorId>
                  </formalParametersDeclsRest>
                </formalParameterDecls>
                <RPAR tokenValue=")" tokenLine="2" tokenColumn="41">
                  <TOKEN tokenValue=")" tokenLine="2" tokenColumn="41"/>
                </RPAR>
              </formalParameters>
              <methodBody tokenValue="{" tokenLine="2" tokenColumn="42">
                <block tokenValue="{" tokenLine="2" tokenColumn="42">
                  <LWING tokenValue="{" tokenLine="2" tokenColumn="42">
                    <TOKEN tokenValue="{" tokenLine="2" tokenColumn="42"/>
                  </LWING>
                  <blockStatements tokenValue="System" tokenLine="3" tokenColumn="1">
                    <blockStatement tokenValue="System" tokenLine="3" tokenColumn="1">
                      <statement tokenValue="System" tokenLine="3" tokenColumn="1">
                        <expressionStatement tokenValue="System" tokenLine="3" tokenColumn="1">
                          <statementExpression tokenValue="System" tokenLine="3" tokenColumn="1">
                            <expression tokenValue="System" tokenLine="3" tokenColumn="1">
                              <primary tokenValue="System" tokenLine="3" tokenColumn="1">
                                <qualifiedIdentifier tokenValue="System" tokenLine="3" tokenColumn="1">
                                  <IDENTIFIER tokenValue="System" tokenLine="3" tokenColumn="1">
                                    <TOKEN tokenValue="System" tokenLine="3" tokenColumn="1"/>
                                  </IDENTIFIER>
                                  <DOT tokenValue="." tokenLine="3" tokenColumn="7">
                                    <TOKEN tokenValue="." tokenLine="3" tokenColumn="7"/>
                                  </DOT>
                                  <IDENTIFIER tokenValue="out" tokenLine="3" tokenColumn="8">
                                    <TOKEN tokenValue="out" tokenLine="3" tokenColumn="8"/>
                                  </IDENTIFIER>
                                  <DOT tokenValue="." tokenLine="3" tokenColumn="11">
                                    <TOKEN tokenValue="." tokenLine="3" tokenColumn="11"/>
                                  </DOT>
                                  <IDENTIFIER tokenValue="println" tokenLine="3" tokenColumn="12">
                                    <TOKEN tokenValue="println" tokenLine="3" tokenColumn="12"/>
                                  </IDENTIFIER>
                                </qualifiedIdentifier>
                                <identifierSuffix tokenValue="(" tokenLine="3" tokenColumn="19">
                                  <arguments tokenValue="(" tokenLine="3" tokenColumn="19">
                                    <LPAR tokenValue="(" tokenLine="3" tokenColumn="19">
                                      <TOKEN tokenValue="(" tokenLine="3" tokenColumn="19"/>
                                    </LPAR>
                                    <expression tokenValue=""Just to have some code"" tokenLine="3" tokenColumn="20">
                                      <primary tokenValue=""Just to have some code"" tokenLine="3" tokenColumn="20">
                                        <literal tokenValue=""Just to have some code"" tokenLine="3" tokenColumn="20">
                                          <LITERAL tokenValue=""Just to have some code"" tokenLine="3" tokenColumn="20">
                                            <TOKEN tokenValue=""Just to have some code"" tokenLine="3" tokenColumn="20"/>
                                          </LITERAL>
                                        </literal>
                                      </primary>
                                    </expression>
                                    <RPAR tokenValue=")" tokenLine="3" tokenColumn="44">
                                      <TOKEN tokenValue=")" tokenLine="3" tokenColumn="44"/>
                                    </RPAR>
                                  </arguments>
                                </identifierSuffix>
                              </primary>
                            </expression>
                          </statementExpression>
                          <SEMI tokenValue=";" tokenLine="3" tokenColumn="45">
                            <TOKEN tokenValue=";" tokenLine="3" tokenColumn="45"/>
                          </SEMI>
                        </expressionStatement>
                      </statement>
                    </blockStatement>
                  </blockStatements>
                  <RWING tokenValue="}" tokenLine="7" tokenColumn="4">
                    <TOKEN tokenValue="}" tokenLine="7" tokenColumn="4"/>
                  </RWING>
                </block>
              </methodBody>
            </voidMethodDeclaratorRest>
          </memberDecl>
        </classBodyDeclaration>
        <RWING tokenValue="}" tokenLine="8" tokenColumn="0">
          <TOKEN tokenValue="}" tokenLine="8" tokenColumn="0"/>
        </RWING>
      </classBody>
    </classDeclaration>
  </typeDeclaration>
  <EOF tokenValue="" tokenLine="8" tokenColumn="1"/>
</compilationUnit>

1 个答案:

答案 0 :(得分:2)

这是不可能的。为了您的信息,将删除在XPath中编写自定义规则的能力,以支持用Java编写它们。