小编Chu*_*ess的帖子

C++的语法歧义

假设有一个声明:

struct A { static int i; };
A a;
Run Code Online (Sandbox Code Playgroud)

据我所知,输入字符串int decltype(a)::i = 0;没有严格描述的行为.

它可以被解析为int decltype(a)::i = 0;,其中: intDECL说明符decltype(a)::ideclarator.

但是,它可以被解析为int decltype(a) ::i = 0;,在哪里 intdecltype(a)被解析为decl-specifers,并且::i是全局变量的(重新)声明i- 编译器应该给出一个错误消息,其类似于"一个decl-specifier-seq不应该包含两个类型 -说明符 ".

我清楚地知道解析的第一种方法应该是正确的,但我找不到任何证据.

无论如何,in int A::a = 0;,A肯定会被解析为declarator因为A类型名称并且如标准中所述

如果一个类型名称在解析DECL说明符-SEQ遇到,它被解释为部分DECL说明符-SEQ当且仅当没有以前的类型说明符之外的其他CV-预选赛DECL说明符--seq.

在constrant中, …

c++ grammar parsing language-lawyer

13
推荐指数
1
解决办法
672
查看次数

制作C++解析器时的模糊度解析

我为C++编写了一个LALR(1)解析器17.我发现了156个歧义,其中一些我可以按照标准解决它,但其他我不能.

例如:当遇到小于的时,解析" operator + <...... "时发生Shift-Reduce冲突:

我们可以解析为:

(1)

template-id - > operator-function-id · <......>

要么:

(2)

unqualified-id - > operator-function-id · 其中(1)需要移位但(2)需要减少.

但是,标准有:

名称查找(3.4)后发现名称是模板名称或者operator-function-id或literaloperator-id引用一组重载函数,其中任何成员都是函数模板,如果后面是<,<始终作为模板参数列表的分隔符,而不是小于运算符.解析模板参数列表时,第一个非嵌套> 137被视为结束分隔符而不是大于运算符.

所以我们选择转变.

不幸的是,有很多含糊不清的地方我找不到解决方案.在这里我列出了其中一些(其中一些可以明确做出选择,但我找不到证据):

  1. 标准中是否有一些部分表明"移位"是出现歧义时的默认选择?

声明符

(1)当解析noptr-declarator并遇到left-paren时,我应该根据以下内容减少它:

ptr-declarator - > noptr-declarator ·

或者改变左派以满足:

声明器 - > noptr-declarator ·参数和限定符

参数和限定符 - > · left-paren参数 - 声明 - 子句右边......

(2)当解析declarator-id并遇到左括号时,我应该根据以下内容减少它:

noptr-declarator - > declarator-id · noptr-declarator - > noptr-declarator ·\left-bracket?constant-expression\right-bracket?attribute-specifier-seq

或移动左方以满足:

noptr-declarator - > declarator-id·attribute-specifier-seq

(attribute-specifier-seq是[[.......]])

c++ parsing lalr

9
推荐指数
1
解决办法
342
查看次数

标签 统计

c++ ×2

parsing ×2

grammar ×1

lalr ×1

language-lawyer ×1