在flex中分隔保留标识符

发布于 2024-10-02 05:37:58 字数 703 浏览 3 评论 0原文

我正在为一种语言制作一个包含函数调用的解析器。一些函数名称是保留的,我想在我的语法中以不同的方式处理它们。在 EBNF 中,看起来

FunctionCall ::= FunctionName '(' ')'
SpecialFunctionCall :: SpecialName '(' ')'

FunctionName ::= VariableName - SpecialFunctionName

SpecialFunctionName ::= "special_function_a" | "special_function_b"

我的问题是将 异常 运算符从 EBNF 转换为 flex。

FunctionName    {Letter}{LetterOrDigit}

SpecialFunctionName 的超集,它是一个硬编码字符串

SpecialFunctionName   "special_function_a" | "special_function_b"

因此我收到 bison 的警告,说 SpecialFunction 永远不会匹配。我应该合并标记并比较解析器中的字符串,还是有推荐的方法来解决 Flex 中的这种歧义?

I have a language I am making a parser for which contains function calls. A few function names are reserved and I would like to handle them differently in my grammer. In EBNF it would look like

FunctionCall ::= FunctionName '(' ')'
SpecialFunctionCall :: SpecialName '(' ')'

FunctionName ::= VariableName - SpecialFunctionName

SpecialFunctionName ::= "special_function_a" | "special_function_b"

My problem is in translating the exception operator from EBNF to flex.

FunctionName    {Letter}{LetterOrDigit}

Is a super set of SpecialFunctionName, which is a hard-coded string

SpecialFunctionName   "special_function_a" | "special_function_b"

Hence I get a warning from bison saying that SpecialFunction will never be matched. Should I merge the tokens and compare the strings in the parser, or is there a recommended way to resolve this ambiguity in in flex?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

赤濁 2024-10-09 05:37:58

处理此问题的正常方法是让词法分析器识别特殊名称,并为特殊名称返回正确的标记类型(SpecialName),并为其他标记返回常规标识符标记(显然是 FunctionName)。

然而,通常需要词法分析器具有不适当的先见之明,才能说特定的(非保留的、非特殊的)单词是函数名而不是简单的标识符(也可以是简单的变量 -除非您已经沿着 Perl 路线使用 sigils 来识别函数中的变量)。

The normal way of dealing with this to have the lexical analyzer recognize the special names and return the correct token type (SpecialName) for the special names and a regular identifier token (apparently FunctionName) for the other tokens.

However, it normally requires an undue degree of prescience on the part of the lexical analyzer to say that a particular (non-reserved, non-special) word is a function name rather than a simple identifier (which could also be a simple variable - unless you've gone down the Perl route of using sigils to identify variables from functions).

盛夏尉蓝 2024-10-09 05:37:58

只要您将 SpecialFunction 规则放在词法分析器文件中的第一个位置:

{SpecialFunctionName}    { return SpecialName; }
{FunctionName}           { return FunctionName; }

任何与两种模式匹配的标识符都将触发第一个规则,从而返回 SpecialName 而不是 FunctionName< /代码>。

As long as you put the SpecialFunction rule FIRST in the lexer file:

{SpecialFunctionName}    { return SpecialName; }
{FunctionName}           { return FunctionName; }

any identifer that matches both patterns will trigger the first rule and thus return SpecialName instead of FunctionName.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文