Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Antlr4中,如何确定哪些词法器子项匹配?_Antlr4 - Fatal编程技术网

在Antlr4中,如何确定哪些词法器子项匹配?

在Antlr4中,如何确定哪些词法器子项匹配?,antlr4,Antlr4,假设我有这个语法来解析ip地址,其中每个八位元可以是十进制或十六进制(这是一个虚构的示例,用来说明我真实世界需要的本质): 当解析器规则“ip”匹配时,使用基本侦听器遍历树,是否有方法确定四个_八位字节lexer令牌的组成?也就是说,我想知道每个八位组是十六进制八位组还是十二进制八位组 在解析器规则的上下文对象中,我看到了一种获取四个八位字节标记的方法,但没有任何进一步深入该标记的方法 我意识到我可以简单地将lexer标记表示为解析器规则,但是接下来我必须在我的实际用例中显式地处理空格和其他混乱

假设我有这个语法来解析ip地址,其中每个八位元可以是十进制或十六进制(这是一个虚构的示例,用来说明我真实世界需要的本质):

当解析器规则“ip”匹配时,使用基本侦听器遍历树,是否有方法确定四个_八位字节lexer令牌的组成?也就是说,我想知道每个八位组是十六进制八位组还是十二进制八位组

在解析器规则的上下文对象中,我看到了一种获取四个八位字节标记的方法,但没有任何进一步深入该标记的方法


我意识到我可以简单地将lexer标记表示为解析器规则,但是接下来我必须在我的实际用例中显式地处理空格和其他混乱的方面

在ANTLR4中没有比次音素更好的了。lexer扫描lexer语法定义的输入,只显示最终结果(包括开始和停止索引、类型、通道和其他一些内容)。最后的结果是单个标记,而不是为解析器规则生成的解析上下文(因此没有子标记或类似标记)

如果可以接受点周围的空格,则可以定义ip规则,以便:

ip: OCTET DOT OCTET DOT OCTET DOT OCTET;
这将允许检查单个八位组。否则,您只能获取结果字符串,将其按点拆分,然后手动处理4个子字符串

ip: OCTET DOT OCTET DOT OCTET DOT OCTET;