相关疑难解决方法(0)

C++是无上下文还是上下文敏感?

我经常听到C++是一种上下文敏感语言的说法.请看以下示例:

a b(c);
Run Code Online (Sandbox Code Playgroud)

这是变量定义还是函数声明?这取决于符号的含义c.如果c是变量,则a b(c);定义名为btype 的变量a.它是直接初始化的c.但是如果c是一个类型,则a b(c);声明一个名为a的函数b,c并返回一个a.

如果您查找无上下文语言的定义,它基本上会告诉您所有语法规则必须具有仅由一个非终端符号组成的左侧.另一方面,上下文敏感语法允许左侧的任意字符串的终端和非终端符号.

浏览"C++编程语言"的附录A,除了左侧的单个非终端符号之外,我找不到单个语法规则.这意味着C++是无上下文的.(当然,在无上下文语言形成上下文敏感语言的子集的意义上,每种无上下文语言也都是上下文敏感的,但这不是重点.)

那么,C++是无上下文还是上下文敏感?

c++ syntax grammar context-free-grammar context-sensitive-grammar

394
推荐指数
14
解决办法
6万
查看次数

是C#的lambda表达式语法LALR(1)?

我想问的问题在标题中简明扼要.让我举一个问题语法的例子:

identifier_list
    : identifier
    | identifier_list identifier;

lambda_arguments
    : '(' identifier_list ')'
    | identifier;

lambda
    : lambda_arguments '=>' expression
Run Code Online (Sandbox Code Playgroud)

然后我们添加正常的C表达式语法 - 特别是

primary_expression
    : '(' expression ')'
    | identifier
    | lambda;
Run Code Online (Sandbox Code Playgroud)

真正的问题是,这个语法LALR(1)是否可解析,即能够被自动解析器生成器解析?或者它需要手动或GLR解析器?请注意,我希望特别了解此小节,而不是上下文相关的关键字内容或任何其他部分.

我现在想的是,如果解析器看到'(' identifier ')',它有两个有效的解析,所以如果解析器看到identifier,向前看')',它将无法决定哪个解析树失效.这可能只是一个转移/减少冲突,我可以通过分配一些任意优先权(可能是有利的'(' identifier ')')来消除.

编辑:实际上,我正在考虑使用这个语法小节来窃取新语言中的类似功能.我已经在语法形式上有类似于JavaScript的匿名函数,但我的豚鼠吱吱声反馈抱怨它们对于许多用途而言过于冗长,并且指出C#lambda表达式是更理想的解决方案.我担心这个解决方案可能导致模糊不清.所以,真的,我只对那个小节感兴趣.其他东西,如泛型和演员表对我来说都不是问题.

以前版本的语法都是机械可解析的,我不想失去这个属性,而我之前使用机械发生器的经验告诉我,最好先检查这里,而不是试试自己.对于我的手动解析器,我当然可以通过特殊情况'(' identifier向前看比正常情况更进一步.

c# parsing lalr

35
推荐指数
3
解决办法
2085
查看次数