首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ANTLR4嵌套模式?

ANTLR4嵌套模式?
EN

Stack Overflow用户
提问于 2017-01-31 04:39:36
回答 1查看 356关注 0票数 0

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

代码语言:javascript
运行
复制
<<! variable, my_variable, A description of my variable !>>

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

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

代码语言:javascript
运行
复制
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' ;
EN

回答 1

Stack Overflow用户

发布于 2017-01-31 05:14:08

首先,在lexer语法中不能有解析器规则-解析器规则以小写字母开头,lexer规则以大写字母开头。

我会这样做(语法可能不正确,但你会明白的):

代码语言:javascript
运行
复制
//default mode is implicitly defined by (or in) ANTLR4
VARIABLE : 'variable' (' ')* ',' -> mode(mode_VariableName);
...
mode mode_VariableName;
//define token with anything ending with comma, many ways to do this...
fragment varNameFrag: [a-zA-Z_0-9]; 
VARIABLE_NAME: varNameFrag varNameFrag* (' ')* ',' -> mode(mode_varDesc);
mode mode_varDesc;
//similar again for variable description
VAR_DESC: //I'll write just a comment here but should more or less match anything except
END_VAR: '!>>' -> mode(DEFAULT_MODE) 

基本上,通过这种方式,您可以跳转到所需的模式,而不是推送和弹出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41945018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档