gpt4 book ai didi

使用 ANTLR 3 解析由两个句点分隔的 float 和范围

转载 作者:行者123 更新时间:2023-12-02 15:36:54 24 4
gpt4 key购买 nike

我正在为具有两个当前“冲突”功能的 DSL 开发解析器:

  1. float ,例如 123.4
  2. 范围指定为 ID[2..5](ID 定义为 'a'..'z'+ 并且无关紧要。部分“[2..5]”最重要。

应该解析它的测试语法如下所示:

grammar DotTest;

span returns [double value]
: ID'['e=INT'..'f=INT']' { /*some code to process the values*/ $value = (double)(Int32.Parse($e.text) + Int32.Parse($f.text)); } ;

num returns [double value]
: DOUBLE {$value = double.Parse($DOUBLE.text); } ;

INT : '0'..'9'+ ;
DOUBLE : '0'..'9'+'.''0'..'9'+ ;
ID : 'a'..'z'+ ;

WS : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ;

问题:规则span 无法正确解析其输入,因为它与DOUBLE 标记冲突。词法分析器尝试将 2..5 匹配为 DOUBLE 但失败了。这是它在 ANTLR Works 中的样子:

Mismatched token exception.

解决此冲突并正确解析 span 中的两个 INT 的正确方法是什么?

P.S. 我使用的是 ANTLR 3 而不是 ANTLR 4,因为我要生成一个 C# 解析器,它目前没有在 ANTLR 4 中实现。

最佳答案

This solution (第二种语法)工作正常。在我将词法分析器规则转换为以下内容之后:

NUM : (INT RNG)=> INT {$type=INT;}  

| (DOUBLE)=> DOUBLE {$type=DOUBLE;}

| INT {$type=INT;};


fragment INT : '0'..'9'+ ;
fragment DOUBLE : '0'..'9'+'.''0'..'9'+ ;

RNG: '..' ;

1..2 等区间的解析开始顺利进行。

关于使用 ANTLR 3 解析由两个句点分隔的 float 和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16033219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com