序言:虽然解析器识别的语言集(无上下文语法)严格大于扫描程序(常规语法),但大多数解析器生成器都需要扫描程序.
(请不要试图解释其背后的原因,我非常了解它们).
我见过解析器,不需要扫描仪
使用无扫描仪有一些优点:
通常,使用"解决方法"就像在解析器的请求上切换扫描程序一样.
问题:你知道其他任何无扫描器解析器生成器(任何语言)吗?这些是实用的(或纯粹的学术性的)?除了Tomita/GLR之外还有其他方法吗?
回答:
ASP.NET MVC的新手,我使用Visual Studio 2013向导创建Web应用程序.它创建从哪里静态文件供应几个文件夹:Content
,Scripts
,等.
其他语言的框架(例如TurboGears)只有静态内容的显式目录,消除了提供页面源代码而不是处理它的风险,这是PHP站点的典型配置错误.
然而,ASP.NET很乐意在应用程序的根目录中提供任何内容,例如http://localhost:1740/Project_Readme.html
,只要它具有正确的扩展名.只有Views
文件夹受保护Web.config
.
如何将应用程序配置为使用除项目根目录之外的其他目录来获取静态文件.例如,如果文件favicon.ico
被放入子目录中Content
,它应该可以访问http://localhost:1740/favicon.ico
,但除了Content
控制器返回之外,没有任何内容在目录之外.
在此目录中不应该执行任何操作,也就是说,如果将*.cshtml文件放入此目录,则应将文件的内容(源代码)作为传递text/plain
.
最终的应用程序将mod_mono
在Linux上运行.
我尝试使用Glibmm(Gtkmm的一部分)在C++中实现GType接口.该对象将被传递给C中的API.不幸的是,gtkmm 的文档没有涵盖它如何包装GObject系统的许多细节.
到目前为止我所拥有的:
class MonaCompletionProvider : public gtksourceview::SourceCompletionProvider, public Glib::Object
{
public:
MonaCompletionProvider();
virtual ~MonaCompletionProvider();
Glib::ustring get_name_vfunc() const;
// ... and some more
}
Run Code Online (Sandbox Code Playgroud)
所有方法和构造函数实现都是空的.代码使用如下:
Glib::RefPtr<MonaCompletionProvider> provider(new MonaCompletionProvider());
bool success = completion->add_provider(provider);
Run Code Online (Sandbox Code Playgroud)
success
执行此代码后将为false,并在命令行中显示以下消息:
(monagui:24831):GtkSourceView-CRITICAL**:gtk_source_completion_add_provider:断言`GTK_IS_SOURCE_COMPLETION_PROVIDER(提供者)'失败
似乎底层gobj()
不知道它应该实现这个接口.如果类不是派生的Glib::Object
,gobj()
甚至返回null.我希望我不必手动编写在C中实现此接口的GObject.
那么这样做的正确方法是什么?提前致谢.
PS:对于那些感兴趣的人:SourceCompletionProvider
我在C中有一个图形结构,并希望对其进行深度复制(包括节点和边缘).
结构如下所示:
struct li_list {
struct li_node n;
};
struct li_node {
struct li_node *next, *prev;
};
struct gr_graph {
struct li_list nodes;
int nodecount;
};
struct gr_node {
struct li_node node;
struct gr_graph *graph;
int pred_count, succ_count;
struct li_list pred, succ;
};
struct gr_edge {
struct li_node succ, pred;
struct gr_node *from, *to;
unsigned long marks;
};
Run Code Online (Sandbox Code Playgroud)
这些结构本身并不存在,而是在另一个结构中"继承",如下所示:
struct ex_node {
struct gr_node _; // "Superclass"
int id;
struct ex_node *union_find_parent;
...
}
Run Code Online (Sandbox Code Playgroud)
是否有一个优雅的解决方案来创建这样的结构的深层副本,包括更新对副本的引用?
注意:嵌套结构的成员不指向它包含的根结构,而是指向它们相关的嵌套结构(例如,ex_node._.pred.n.next
指向a ex_edge._.pred
).当必须更新这些时,这意味着繁琐的指针算法. …
我将第三方项目提交到我自己的svn存储库中.现在,我得到了该项目的新版本,我想在我的存储库中替换它.
该项目非常大(1.2GB),新版本有新文件/目录,也删除了文件/目录.
琐碎的解决方案是
svn rm project
mv /path/to/new/project .
svn add project
svn ci
Run Code Online (Sandbox Code Playgroud)
但是,我放弃了历史.此外,svn服务器将无法使用增量压缩(是的,服务器空间确实很重要).
另一种方法是只覆盖工作目录中的所有文件,然后提交它.但是,已删除的文件仍保留在存储库中.svn add --force *
也"忘了"添加一些文件.
提交新版本的其他可能性有哪些?这是一个不寻常的用例,所以没有内置支持吗?(使用Tortoise SVN我会弄乱.svn
文件夹,Tortoise提供删除提交对话框中丢失的文件/文件夹,但命令行版本如果遇到未删除的文件/文件夹则拒绝提交svn rm
)
额外1:如何避免我的存储库中的更改被覆盖?(只有少数,所以目前可以重新申请)
额外2:我用目的地的副本替换了所有符号链接(以消除special status changed
错误).怎么避免这个?
额外3:如何应对重命名的文件/目录?由于我刚刚获得没有更改历史记录的新版本,因此无法自动确定这些版本.svn mv
在提交之前?
我isprint
在Visual Studio 2017下有一个意外的结果.给出以下程序
#include <ctype.h>
#include <stdio.h>
int main() {
for (int i = 0; i < 128; i += 1) {
printf("isprint(0x%x aka '%c') = %s (%d)\n", i, (char)i,
isprint((char)i) ? "yes" : "no", isprint((char)i));
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用编译和执行
cl /MD isprint.c /Feisprint.exe && isprint.exe
Run Code Online (Sandbox Code Playgroud)
回报
Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26433 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
isprint.c
Microsoft (R) Incremental Linker Version 14.14.26433.0
Copyright (C) Microsoft Corporation. All rights reserved. …
Run Code Online (Sandbox Code Playgroud)