当前位置: 首页 > 知识库问答 >
问题:

ANTLR 4 lexer令牌内其他令牌

岳永思
2023-03-14

我有以下ANTLR 4的语法:

grammar Pattern;

//parser rules
parse   : string LBRACK CHAR DASH CHAR RBRACK ;
string  : (CHAR | DASH)+ ;

//lexer rules
DASH    : '-' ;
LBRACK  : '[' ;
RBRACK  : ']' ;
CHAR    : [A-Za-z0-9] ;

我试图解析以下字符串

ab-cd[0-9]

代码解析出左侧的ab cd,在我的应用程序中,它将被视为文本字符串。然后,它将解析为一个字符集,在这种情况下,该字符集将转换为任何数字。我的语法对我来说很有用,但我不喜欢将语法作为语法分析器规则(CHAR | DASH),因为它只是被当作一个标记。我希望lexer创建一个字符串,并给我以下标记:

"ab-cd" "[" "0" "-" "9" "]"

而不是这些

"ab" "-" "cd" "[" "0" "-" "9" "]"

我看了其他的例子,但还没有弄明白。通常,其他示例在此类字符串文字周围有引号,或者有空格来帮助分隔输入。我想避免两者兼而有之。这可以通过lexer规则来完成吗,或者我需要像现在这样继续在解析器规则中处理它吗?

共有1个答案

尹庆
2023-03-14

在ANTLR 4中,您可以使用lexer模式来实现这一点。

STRING : [a-z-]+;
LBRACK : '[' -> pushMode(CharSet);

mode CharSet;

DASH : '-';
NUMBER : [0-9]+;
RBRACK : ']' -> popMode;

解析[字符后,lexer将在模式CharSet下运行,直到到达]字符并执行popMode命令。

 类似资料:
  • 我有一个计划的WebJob,每天运行,检查数据库中所有用户的密码过期日期。如果密码到期日是今天,它将生成密码重置令牌并通过电子邮件发送给用户。然后用户单击电子邮件中的url,并被带到一个网站,在那里输入新密码。 我设法在我的WebWork中生成一个令牌,并通过电子邮件发送。但是,通过我的Asp重置密码时。NET网站我得到无效令牌。我不明白为什么。我假设它一定与我的WebWork中的令牌提供商有关。

  • 我试图创建一个身份提供者,用户在其中登录到应用程序(然后被重定向),并管理其帐户凭据,并提供承载令牌。单独运行Blazor WASM web应用程序,该应用程序管理应用程序逻辑,但也有一个管理面板,管理员可以在其中创建用户、重置密码、管理角色/权限等。该管理面板调用API。 身份提供程序在上运行https://localhost:5000 现在,当我在这个管理面板中创建一个用户时,API被调用,它

  • 其他常用命令 编辑 hosts 文件:vim /etc/hosts,添加内容格式:127.0.0.1 www.youmeek.com RPM 文件操作命令: 安装 rpm -i example.rpm,安装 example.rpm 包 rpm -iv example.rpm,安装 example.rpm 包并在安装过程中显示正在安装的文件信息 rpm -ivh example.rpm,安装 exa

  • 我不熟悉,它代表。我混淆了它的两个术语:访问令牌和刷新令牌。 用户注册/登录站点后,我创建和。 将刷新标记保存在数据库或cookie中。 15分钟后,用户标记访问令牌过期。 如果用户空闲2小时,我将从cookie或DB中删除刷新令牌,否则我将使用刷新令牌续订访问令牌。 有什么优化的方法可以达到这个目的吗?

  • 我使用postMan,输入请求地址http://localhost:8011/umrah/oauth/token?client_id=client_2&username=1234567&password=123456&grant_type=password&client_secret=123456,点击send按钮,出现错误,在内存中工作正常,当我想使用Jdbc令牌存储时,想法控制台错误:找不到令