首页 > 编程语言 >antlr 在一段字符可被多个 terminal node 匹配时的行为

antlr 在一段字符可被多个 terminal node 匹配时的行为

时间:2023-12-29 16:35:55浏览次数:30  
标签:node STRING title antlr lexer NUMBER rule terminal token

考虑下面一段 antlr 语法

STRING: [a-zA-Z0-9]+;
NUMBER: [0-9]+;
NEWLINE: '\r'? '\n';

root: id title EOF;

id: 'id:' NUMBER NEWLINE;
title: 'title:' STRING NEWLINE;

我们希望 id: 后面只存在数字,而 title: 后买可存在数字或字母,因而定义了 NUMBERSTRING 两个 terminal node 规则
然而这一段语法并不能正常工作

这就需要了解 antlr 解析的流程,其中与我们这个问题相关的有这两部分:

  • lexing:将输入的文本解析为一个个 token,进而构建一个 token stream 来作下面的处理
  • parsing:将 token 构建成 parse tree

对于 lexing:

  • 所有以大写字母开头规则对应着 parse tree 中的 terminal node,有且只有它们被用来进行 lexing,这些规则是 lexer rule
  • antlr 会找到一个以当前的位置为起点、极长的、满足任意 lexer rule 的字符串,也就是如果将找到的这个字符串长度再加一,那么不存在任何 lexer rule
  • 如果只有一个 lexer rule 能和这个字符串匹配,那么本次匹配找到的 token 自然就是这个 lexer rule 对应的 token
  • 如果有多个,那么找到的 token 是按照语法文件定义顺序第一个 lexer rule 对应的 token

因此,title: abc12345abc12345 可以被 STRING 匹配,而 id: 12345 仍然会被 STRING 匹配,因为 STRING 被定义在 NUMBER 前面。而 id 这条规则又要求匹配一个 NUMBER,这样就造成了错误
如果把 NUMBERSTRING 的顺序调换,那么 title: 12345 又会匹配到 NUMBER,依然存在错误

正确做法:

  • 让所有 lexer rule 不交,转而使用非终止节点对应的规则,并允许其匹配多个 lexer rule,例如:string: (LETTER | DIGIT)+; number: DIGIT+;
  • 将规则分散到多个语法文件中,再导入

标签:node,STRING,title,antlr,lexer,NUMBER,rule,terminal,token
From: https://www.cnblogs.com/suxxsfe/p/17935181.html

相关文章

  • Windows环境检验NodeJs安装是否成功
    Windows环境检验NodeJs安装是否成功检验方法1、win+R打开运行窗口,在此窗口输入cmd命令编辑2、进入命令提示符窗口,分别输入以下命令,显示版本号,则安装成功node-v:显示安装的nodejs版本npm-v:显示安装的npm版本编辑如上图说明安装成功我本机的环境版本低一点因为是安装鸿蒙IDE自动安......
  • nodejs学习05——mongoose
    简介Mongoose是一个对象文档模型库,官网http://www.mongoosejs.net/作用:方便使用代码操作mongodb数据库初体验//1.安装mongoose//2.导入mongooseconstmongoose=require('mongoose');//设置strictQuery为truemongoose.set('strictQuery',true);//3.连接......
  • [Node]Node.js安装
    工作需求,将本地node.js升级到v20+,踩坑踩了1个多小时,故整理一篇攻略自用。 下载与安装1.Node.js官网下载安装包:https://nodejs.org/en(我下载的是20.10.0)2.安装时修改安装目录,网上教程大多不建议放在C盘;其余默认。3.安装完后启动命令行工具,输入node-v可查看安装好的版本......
  • OS-Ubuntu-Server-Connect to Wi-Fi From Terminal on Debian 11/10 with WPA Supplic
    ConnecttoWi-FiFromTerminalonDebian11/10withWPASupplicantLastUpdated:November8th,2022XiaoGuoan(Admin)31CommentsDebianThistutorialisgoingtoshowyouhowtoconnecttoWi-FinetworkfromthecommandlineonDebian11/10serverandd......
  • 在nodejs环境里使用canvas和sharp生成图片
    1.安装依赖包npminstalljsdomcanvas2.实例代码const{JSDOM}=require('jsdom');const{createCanvas}=require('canvas');//创建一个虚拟DOM环境constdom=newJSDOM('<!DOCTYPEhtml><html><head></head><body>&......
  • vue前端node内存溢出问题解决
    前端项目运行时,如果经常运行慢,崩溃停止服务,报如下错误:FATALERROR:CALL_AND_RETRY_LASTAllocationfailed-JavaScriptheapoutofmemory(JavaScript堆内存不足) 原因:因为在Node中,通过JavaScript使用内存时只能使用部分内存(64位系统:1.4GB,32位系统:0.7GB),这个时候,如......
  • sse node搭建server
    sse-client.tsexportdefaultclassSSEClient{source:EventSource;element:HTMLElement;constructor(url){this.source=newEventSource(url||'http://127.0.0.1:8844/stream');this.source.onopen=this.onOpen.bin......
  • node.js
    npm安装的包,dependences下的包和devDependences下得包有什么区别dependences:生产环境使用的包,代码运行必要的包,没有包运行时会报错,如lodashdecDdpendences:开发环境使用的包,代码运行不必要,没要包代码也能跑,使用这些包的目的是方便开发人员做项目,如webpack......
  • node node-sass sass-loader版本对应问题(转)
    1.查看本地node版本node-v具体对应版本如下图:具体对应链接地址:node-sass2.查看项目中package中node-sass和sass-loader是否对应node版本3.不对应应修改成对应版本号以下是部分版本号对应,具体可百度sass-loader4.1.1,node-sass4.3.0sass-loader7.0.3,node-sass4.7.2......
  • Node.js+Express+Koa2开发接口学习笔记(三)
    数据库操作(创建和增删查)使用Navicat快速创建myblog数据库创建表使用navicat快速建表使用sql语句进行简单的查询--showtables;--显示该数据库中的所有表INSERTINTOusers(username,`password`,realname)VALUES('zhangsan','123','张三')INSERTINTOusers(......