ANTLR4模糊-如何解决

问题描述

我想解决以下歧义:

    $scope.delete_plot = function(){
        check = confirm("Are you sure to delete this plot?")
        if(check){
            console.log("yes,OK pressed")
        }else{
            console.log("No,cancel pressed")

        }
    }

样本输入:

grammar test;

WS  :   (' ' | '\t' | '\n' | '\r' | '\f')+ -> skip;

program
    :
    input* EOF;

input
    :   '%' statement
    |   inputText
    ;

inputText
    :   ~('%')+
    ;

statement
    :   Identifier '=' DecimalConstant ';'
    ;

DecimalConstant
    :   [0-9]+
    ;

Identifier
        :   Letter LetterOrDigit*
        ;

fragment
Letter
        :   [a-zA-Z$#@_.]
        ;

fragment
LetterOrDigit
        :   [a-zA-Z0-9$#@_.]
        ;

只要我在“ aa”后加一个空格,例如“ bbbb”,就会产生歧义。 实际上,我希望inputText包含完整的字符串“ aa bbbb”。

解决方法

没有歧义。输入aa bbbb将始终标记为2个Identifier标记。无论解析器规则尝试匹配什么。该词法分析器独立于解析器运行。

此外,规则:

inputText
    :   ~('%')+
    ;

'%'以外的一个或多个字符不匹配。

在解析器规则内部,~取消标记,而不是字符。因此,解析器规则中的~'%'将匹配'%'令牌以外的任何令牌。在词法分析器内部,~'%'匹配'%'以外的任何字符。

但是创建像这样的词法分析器规则:

InputText
    :   ~('%')+
    ;

将导致您的示例输入被标记为单个'%'标记,后跟与此匹配的较大的第二个标记:a=5;\naa bbbb。 ANTLR的词法分析器就是这样工作的:尽可能匹配字符(无论解析器规则尝试匹配什么字符)。

,

我找到了解决方法:

ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.