ANTLR4嵌套模式?

时间:2017-01-30 20:39:36

标签: c# antlr4

我正在尝试解析以下字符串:

<<! variable, my_variable, A description of my variable !>>

从我在这里做的阅读中,我认为我需要使用模式来区分文字字符串'variable',变量名(my_variable)和变量描述的词法分析器。

我遇到的问题是我不确定如何构建它。是否可以嵌套模式?是否有更好/更聪明的方法来组织我的词法规则?

lexer grammar VariableLexer;

variableMarkdown : DELIMITER_OPEN SPACE VARIABLE COMMA SPACE variable_name COMMA SPACE description SPACE DELIMITER_CLOSE;

description : WORDS ;

variable_name : ID ;

DELIMITER_OPEN : '<<!' ;
DELIMITER_CLOSE : '!>>';

COMMA : ',' ;
SPACE : ' ' ;

VARIABLE : 'variable' -> pushMode(VariableName);

mode VariableName;
ID : LOWERCASE ( LOWERCASE | NUMBER | UNDERSCORE )* -> pushMode(VariableDescription) ;

mode VariableDescription;
WORDS : ( UPPERCASE | LOWERCASE | NUMBER | SPACE )+ -> popMode;


fragment LOWERCASE : 'a'..'z' ;
fragment UPPERCASE : 'A'..'Z' ;
fragment UNDERSCORE : '_' ;
fragment NUMBER : '0'..'9' ;

1 个答案:

答案 0 :(得分:0)

首先 - 你不能在词法分析器语法中使用解析器规则 - 解析器规则以小写字母开头,而词法分析器则以大写字母开头。

我这样做(可能不是正确的语法,但你会得到这个想法):

$(document).ready(function(){
    Login.initialise();
});
var Login = (function(){
    var login = function(){
        var data = Util.serializeForm("#loginform");
        var request = {
                        "ssoid":data.userName,
                        "password":$("#password").val(),
                        "captcha" : data.textCaptcha
                    };
        $( "#loginform" ).submit();
    };
    var loginFormReset = function(){
        console.log("loginFormReset");
    };
    var refreshCaptcha = function(e){
        if(e){
            e.preventDefault();
        }
        $('#captchaImage').attr(
            'src',Util.getContextPath()+'/RegisterCaptchaController'
        );

    };
    var init = function(){
        refreshCaptcha();
        $("#btnLogin").click(login);
        $("#btnLoginReset").click(loginFormReset);
        $("#refreshCaptcha").click(refreshCaptcha);
        $("#refreshCaptchaTop").click(refreshCaptcha);
    };
    return{
        initialise:init
    }
})();

基本上这样你就可以跳到你需要的模式而不是推动和弹出。