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

为什么antlr4 c语法解析器规则“typespecifier”没有使用lexer规则“double”?

农飞星
2023-03-14

我正在使用antlr4 c语法作为我自己语法的灵感。我来了一件事,我真的不明白。为什么没有使用数据类型时会有Lexer规则?例如,规则double:'double';从未使用过,但分析器规则typespecifier:('double'...);(为了简化已删除其他数据类型)使用了好几个地方。解析器规则typeSpecifier没有使用lexer规则double有什么原因吗?

共有1个答案

巴照
2023-03-14

该页面上的所有语法都是志愿者提交的,不是ANTLR4的一部分。这显然是一个错误,但与lexer规则相匹配的方式不会对lexing产生任何影响。您可以选择实现显式规则:

Double : 'double';

或者是隐含的:

typeSpecifier
    :   ('void'
    |   'char'
    |   'short'
    |   'int'
    |   'long'
    |   'float'
    |   'double'

无论哪种方式都没有不良影响,即使你混合了方法。事实上,如果您对整个语法进行更全面的观察,作者对许多其他lexer规则也做了同样的事情,例如register。在实际操作中没有区别。

底线?选择你喜欢的任何一种方法,并始终如一地应用它。我的个人偏好是简洁,所以我喜欢隐含的标记,只要它们只在语法中的一个地方使用。当一个令牌可能在两个地方使用时,我更喜欢用它来创建一个显式的令牌,并更新使用它的两个或多个位置。

 类似资料:
  • 我有Antlr4中的语法,用来解析和验证定制语言。在其他方面,我的语法应该认为以下是“有效的” //将字符串值赋给变量 //带有字符串参数的函数 //带有特定格式(日期)的函数 下面是我语法中的相关部分

  • 我们在ANTLR中遇到的问题是,我们有这样一个语法: 请记住“鲍勃。”第一行是动态的,可以是任何东西。其中之一就是“鲍勃”。“Bob Offset”行不是动态的,它存在于我们正在解析的每一个类型的文件中。 理想的解决方案是,如果ANTLR有某种方法来指定上下文或解析器规则特定的lexer规则。这样,“Bob offset:”标记在语法中的其他地方就不会出错了。 对此问题的任何想法都将不胜感激。

  • ANTLR语法中解析器和词法分析器规则的调用顺序是什么?例如,在以下语法中,输入 223 始终标识为APLHANUMERIC而不是数字

  • 可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?

  • CloudGate解析规则可以直接导入使用,不需要任何额外的操作,非常方便! 规则列表 规则名称 下载地址 Surge https://async.be/Rule/Basic/Hosts Shadowrocket https://async.be/Rule/Basic/Hosts 解析规则 简要概述:通过实时同步Hosts信息源达到自动更新,同时使用解析模板进行生成。 无需任何其他操作,导入即可使

  • template.defaults.rules art-template 可以自定义模板解析规则,默认配置了原始语法与标准语法。 修改界定符 // 原始语法的界定符规则 template.defaults.rules[0].test = /<%(#?)((?:==|=#|[=-])?)[ \t]*([\w\W]*?)[ \t]*(-?)%>/; // 标准语法的界定符规则 template.def