我一直在做 Udacity CS262,对于检测歧义问题,我不确定我的解决方案是否正确,我也不确定“官方”解决方案是否正确。
问题简要描述:编写一个函数 isambig(grammar, start, string),它接受有限上下文无关语法(编码为 python 字典)、语法的起始符号和字符串。如果有两个解析树通向该字符串,则语法是不明确的(或者至少这是我对歧义的理解 - 如果我错了,请纠正我)。如果语法不明确,则返回 True。否则返回False。
测试用例:
grammar1 = [
("S", [ "P", ]),
("S", [ "a", "Q", ]) ,
("P", [ "a", "T"]),
("P", [ "c" ]),
("Q", [ "b" ]),
("T", [ "b" ]),
]
print isambig(grammar1, "S", ["a", "b"]) == True
print isambig(grammar1, "S", ["c"]) == False
grammar2 = [
("A", [ "B", ]),
("B", [ "C", ]),
("C", [ "D", ]),
("D", [ "E", ]),
("E", [ "F", ]),
("E", …Run Code Online (Sandbox Code Playgroud) 我正在用yacc / bison编写一个简单的计算器。
表达式的语法看起来有点像这样:
expr
: NUM
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '+' expr %prec '*' { $$ = $1; }
| '-' expr %prec '*' { $$ = $1; }
| '(' expr ')' { $$ = …Run Code Online (Sandbox Code Playgroud) 重复以下问题:C函数冲突
嗨,在我目前的项目中,我必须使用某种接口库.函数名由这个接口给出,这个函数做的是开发人员的选择.据我所知,项目应该使用这个函数,当涉及到编译时,你可以选择lib并使用它来实现功能.我尝试做的是通过包装另一个并在mein函数中调用它来同时使用现有的lib和我的lib:
otherlib:
int function1 (int a) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
MYLIB:
int function1 (int a) {
//my code here
otherlib::function1(a);
}
Run Code Online (Sandbox Code Playgroud)
问题是我没有访问其他lib,而其他lib没有任何名称空间.我已经试过了
namespace old {
#include "otherlib.h"
}
Run Code Online (Sandbox Code Playgroud)
然后在我的函数中通过old :: function1调用旧函数.只要它是唯一的头文件,这就可以工作.lib将它的符号输出回全球空间.还有类似的东西
namespace new {
function1 (int a) {
::function1(a);
}
}
Run Code Online (Sandbox Code Playgroud)
没用.最后但并非最不重要的是我尝试了ifdef和这里建议的定义
但我没有成功.
任何想法如何解决这个问题?提前致谢.
编辑:我既没有访问旧的lib也没有项目的两个库都应该使用.
EDIT2:至少旧的lib是静态的
考虑以下函数原型:
void Remove(SomeContainer& Vec, const std::size_t Index);
SomeContainer Remove(SomeContainer Vec, const std::size_t Index);
Run Code Online (Sandbox Code Playgroud)
第二个是第一个实现的.也就是说,它们在各个方面在功能上是相同的,除了一个是通过引用传递而另一个是按值传递.
但是,GCC说这些在这种情况下是模糊的,即使第一种形式是唯一一种不返回值的形式:
Remove(SomeContainer, 123);
Run Code Online (Sandbox Code Playgroud)
有没有解决方法,或者我必须为每个表单提出不同的名称?
我有一个控制器,有3个重载的create方法:
public ActionResult Create() {}
public ActionResult Create(string Skill, int ProductId) {}
public ActionResult Create(Skill Skill, Component Comp) {}
Run Code Online (Sandbox Code Playgroud)
在我的一个观点中,我想创建这个东西,所以我称之为:
<div id="X">
@Html.Action("Create")
</div>
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
{"控制器类型'XController'上的当前操作请求'Create'在以下操作方法之间是不明确的:System.Web.Mvc.ActionResult类型X.Web.Controllers.XController上的Create()System.Web.Mvc.ActionResult在类型X.Web.Controllers.XController上创建(System.String,Int32)System.Web.Mvc.ActionResult在类型X.Web.Controllers上创建(X.Web.Models.Skill,X.Web.Models.Component). XController"}
但由于@html.Action()没有传递任何参数,因此应该使用第一个重载.它对我来说似乎不明确(这只意味着我不认为像ac#编译器).
任何人都可以指出我的方式错误吗?
我目前正在制作一个扑克手历史解析器,作为我的单身汉项目的一部分.我过去几天一直在做一些研究,并遇到了一些不错的解析器生成器(其中我选择了JavaCC,因为项目本身将用Java编码).
尽管手历史语法非常基本且直截了当,但由于玩家昵称中允许的一组字符存在歧义问题.
假设我们有一个以下格式的行:
Seat 5: myNickname (1500 in chips)
Run Code Online (Sandbox Code Playgroud)
令牌myNickname可以包含任何字符以及空格.这意味着,这两个(1500 in chip和Seat 5:有效的绰号-这最终导致的模糊问题.除了长度(4-12个字符)之外,对玩家的昵称没有限制.
我需要解析并存储几个数据以及玩家的昵称(例如在这种特殊情况下的座位位置和筹码数量),所以我的问题是,我在这里有什么选择?
我很乐意使用JavaCC来做这件事:
SeatRecord seat() :
{ Token seatPos, nickname, chipStack; }
{
"Seat" seatPos=<INTEGER> ":" nickname=<NICKNAME> "(" chipStack=<INTEGER>
"in chips)"
{
return new SeatRecord(seatPos.image, nickname.image, chipStack.image);
}
}
Run Code Online (Sandbox Code Playgroud)
现在哪个不起作用(由于上述问题)
我还搜索了GLR解析器(显然处理了暧昧的语法) - 但是除了Bison之外,它们似乎大多被放弃或记录不佳,但是它不支持Java的GLR解析器,并且可能太复杂而无法使用anway(除了歧义问题,语法本身是非常基本的,正如我所提到的)
或者我应该坚持自己标记字符串,并使用indexOf(), lastIndexOf()等来解析我需要的数据?只有当它是剩下的唯一选择时我才会这样做,因为它太丑了恕我直言,我可能会错过一些情况(这会导致错误的解析)
我制作了一个带有GUI和一些用于用户设置的设置文件的C#应用。但是,当我要读取设置的当前值时,MySettings.Default.SettingsName;说它非常适合第一组设置MyFirstSettings。但是,对于第二个,我们称之为,它MySecondSettings的错误度量为Ambiguity between My first Settings.Default and MySecondSettings.Default。我无法找到其他任何方式来访问设置,但使用了.Default。
任何提示将不胜感激!
阿克塞尔
我有一个模板,如果我传递一个lambda,但在一个相关的模板,其中两个lambda映射到相同的模板类型,它不能推断该类型,并且MSVC++ Express 2013抱怨模板参数是不明确的.为了清楚起见,这里没有超载(或专业化) - 下面的两个例子是唯一具有这些标识符的实体.以下是模板,它只是在参数上应用可调用对象并返回结果:
template <class A, class OP>
auto WhichOp1(A argument, OP firstOp)->decltype(firstOp(argument)) {
return firstOp(argument);
}
template <class A, class OP>
auto WhichOp2(A argument, OP firstOp, OP secondOp)->decltype(firstOp(argument)) {
return firstOp(argument) + secondOp(argument);
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样成功使用WhichOp1:
int e = WhichOp1(2, [](int i){return i * 2; });
Run Code Online (Sandbox Code Playgroud)
但类似的调用WhichOp2将无法编译:
int d = WhichOp2(2, [](int i){return i * 2; }, [](int i){return i * 3; });
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误C2782:'unknown-type chaj :: ops :: WhichOp2(A,OP,OP)':模板参数'OP'不明确
IntelliSense:没有函数模板实例"chaj :: ops :: WhichOp2"匹配参数列表参数类型是:(int,lambda [] int(int i) …
我一直在努力理解java编译,我遇到了一个问题.假设我们有这样的课程设置
public class Ambiguity
{
static class G
{
void A()
{
System.out.println("Regular Method");
}
}
static class b
{
static void A()
{
System.out.println("Static Method");
}
}
public static void main(String[] args)
{
G b = new G();
b.A();
}
}
Run Code Online (Sandbox Code Playgroud)
编译器如何知道static void A()在类型对象上调用方法class b或常规方法的天气.基于我运行的测试它似乎调用对象(类型)方法但我不知道这是否始终是标准过程.在这种情况下,如何调用静态方法.void A()bGbG
#include <string>
using String = std::string;
class Base {
protected:
String value;
};
class Readonly : virtual Base {
public:
const String& method() const {
return value;
}
String& method() {
return value;
}
};
class Writeonly : virtual Base {
public:
Writeonly& method(const String& value) {
this->value = value;
return *this;
}
Writeonly& method(String&& value) {
this->value = std::move(value);
return *this;
}
};
class Unrestricted : public Readonly, public Writeonly {};
void usage() {
String string;
Unrestricted unrestricted;
unrestricted.method(string); …Run Code Online (Sandbox Code Playgroud) c++ multiple-inheritance ambiguity member-functions name-lookup