如何在语法分析表达式语法(如PEG.js)中处理语法歧义(如C中的歧义)

问题描述 投票:3回答:1

因此,根据我的有限理解,C has syntax ambiguity如表达式中所示:

T(*b)[4];

Here关于这种事情的说法:

解析C的众所周知的“ typedef问题”是,除非词法分析器将由typedef绑定的标识符和其他标识符区分为两个单独的词法类,否则标准C语法是模棱两可的。这意味着解析器需要在解析期间将范围信息提供给词法分析器。结果之一是词法分析必须与解析同时进行。

问题是它可以根据上下文解释为乘法或指针(由于我不是C专家,所以我不是100%理解它的细节,但是我了解了它的要点以及为什么要这样做一个问题)。

typedef a;
b * a;                    // multiplication
a * b;                    // b is pointer to type a 

[我想知道您是否要使用诸如this C grammar之类的解析表达式语法(PEG)来解析C,它如何处理这种歧义?由于这种问题,我认为该语法不是100%正确的,因此我想知道您将如何解决它。它需要什么来跟踪或做出不同的处理?

c parsing syntax peg
1个回答
0
投票

嗯,您可能需要学习一些编译器技术才能了解这一点,但是这里有一些技巧应该会有所帮助。

像您的示例中的运算符'*',如果它用于定义指针类型或指针取消引用,则它是一元运算符,这意味着它仅需要一个操作数:

*a = 10; // '*' as unary operator

如果用于乘法,则它是一个二进制运算符,表示它需要两个操作数:

b = 2 * 10; // '*' as binary operator

因此,解析表达式,您可以尝试以下操作:

1. if need an operand, check next token if it's '*'
2. if it's '*', it's unary operator (for pointer)

a. or if you need a binary operator(like '+', '-'), the next token may be binary '*'

解析类型定义(不是初始化),您永远不会遇到二进制'*'。

这可能不是您想要的答案(我不知道PEG),但是我还不能添加评论,所以希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.