不耐烦的总结:我正在寻找关于为公共语言结构生成代码但不解析的好参考.
我对编程语言很感兴趣,并尝试尽可能多地阅读文献.但是大多数都是从功能和理论的角度来讨论这个话题,我觉得很难理解,更不用说实现这些想法了.
所以问题是; 您建议哪些资源以更加迫切和实用的方式涵盖主题的编程语言实现?
例如,我发现" Lua 5.0的实现 "论文非常有启发性.
请注意,我不是在寻找有关解析或标记的文章.
我正在生成C++代码,看起来它会变得非常混乱,即使我的简单生成类已经有很多特殊情况.以下是现在的代码:http://github.com/alex/alex-s-language/tree/local%2Fcpp-generation/alexs_lang/cpp.
我正在开发一个项目,该项目必须连接到一些古老的Web服务,这些Web服务将请求和响应的一些分层数据打包成单个分层XML字符串.
我一直在使用xsd.exe从示例请求和响应XML片段生成XSD,在必要时修改它们以获得最佳定义,并再次使用xsd.exe生成C#对象.然后,调用web服务的管理器可以将这些强类型请求对象作为参数,将它们序列化为字符串以进行调用,将响应作为字符串返回,将它们反序列化为强类型响应对象并返回它们.
如果我有一个字符串列表,我可以有一个有效的XSD,它认为它是一个复杂类型的无界xs:选择xs:string元素,然后它会反序列化为一个字符串数组,这很好,处理起来很简单.令人烦恼的问题是,由于某种原因,似乎没有任何方法可以让它调用除" Items " 之外的任何字符串数组.无论什么我添加到架构,我不能让XSD.EXE写任何其他名称.
这是一个示例XSD架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="AccountStatusRequest" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="AccountStatusRequest">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded" id="AccountRowIDs">
<xs:element nillable="true" type="xs:string" id="AccountRowID" name="AccountRowID"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
由此产生的课程:
public partial class AccountStatusRequest {
private string[] itemsField;
[System.Xml.Serialization.XmlElementAttribute("AccountRowID", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
public string[] Items {
get {
return this.itemsField;
}
set {
this.itemsField = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试将intellisense中的每个msdata:属性添加到选择和内部元素中,没有任何区别.
仅仅为了论证,我为该complexType添加了一些额外的类似选择,看看是否会强制它使用字符串数组的名称,而是它给了我Items,Items1,Items2 ......
我真的不希望它必须是一个只拥有字符串的自己类型的数组,但我也真的不想留下它叫做" Items ",没有xml注释(有没有人知道如何添加THOSE到一个xsd?),它应该有一个更具描述性的名称.我绝对不能只是手动将其更改为Web服务模式更改时所需的工作流程,即更改XSD然后从中重新生成类.
这似乎是xsd.exe应该支持的另一个东西.有什么我想念的吗?我应该以某种方式采取不同的方法吗?或者是否有一种替代工具可以用于此而不是跛脚?
在我的项目的构建(编译)时,我需要为java类进行代码生成.生成的java类是一个带有一组getter和setter的java bean类.在构建时,我得到类的名称和变量的名称.所以我需要做的是从我拥有的信息中动态生成java bean.
例如.在编译时我得到了以下数据.
class-name=Test
variable-name=aaa
Run Code Online (Sandbox Code Playgroud)
所以generate类应该如下所示.
public class Test {
public String aaa;
public void setVar(String str) {
this.aaa = str;
}
public String getVar(){
return this.aaa;
}
}
Run Code Online (Sandbox Code Playgroud)
当我搜索一个我可以使用的工具时,我发现Arch4j [1]很有趣,但问题是它与Apache 2.0许可证不兼容.我正在寻找一个与Apache 2.0许可证兼容的项目/工具.
如果有人能给我一些关于如何做到这一点的见解,我将不胜感激.
[1] - http://arch4j.sourceforge.net/components/generator/index.html
我要进行JIT代码生成,并且我想在流中插入无效的操作码以执行一些元调试.一切都很好,直到它达到指令,此时东西进入无限循环的非法指令信号处理程序和返回.
有什么方法可以设置简单地跳过错误的指令吗?
GCC 4.5.2(在Ubuntu 11.10 x64上,但编译为32位)生成无效的汇编代码,我很好奇是否可以在不更改代码的情况下修复,只需应用选项或类似的东西即可.请注意,优化已经是-O0.
我有两个功能:
inline long Class::Get()
{
long v = *(long*)(m_p);
m_p += 4;
return v;
}
inline void Class::Command()
{
m_p += Get();
}
Run Code Online (Sandbox Code Playgroud)
GCC 4.5.2生成此汇编代码:
9840 m_p += Get();
f689eff5: mov 0x8(%ebp),%eax
f689eff8: mov 0xd4(%eax),%eax
f689effe: mov %eax,%esi
f689f000: mov 0x8(%ebp),%eax
f689f003: mov %eax,(%esp)
f689f006: call 0xf66116a0
f689f00b: lea (%esi,%eax,1),%edx
f689f00e: mov 0x8(%ebp),%eax
f689f011: mov %edx,0xd4(%eax)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它将m_p值存储在%esi中,然后使用lea将返回值添加到它.但是 :: Get()也会改变m_p!海湾合作委员会似乎并未意识到这一点.因此,错误m_p不正确(比预期少4个字节),因为%esi中的值已过时.
我可以使用它修复它
inline void Class::Command()
{
long v = Get();
m_p += v;
}
Run Code Online (Sandbox Code Playgroud)
但我只是想知道我是否可以在不更改代码的情况下应用一些pragma或smth,以使bug消失.至于gcc版本,我坚持使用给定的版本.
当我在Visual Studio 2012中创建一个新的ADO.NET实体数据模型时,它为我提供了一个免费的EF 5.x DbContext生成器代码生成项.换句话说,如果我在解决方案资源管理器中展开我的edmx项目,我会看到一对.tt文件,理论上应该神奇地生成包含我的POCO类和我的DbContext类的.cs文件.
我的问题是我无法说服Visual Studio实际创建类.Model1.tt包含一个空的Model1.cs,而Model1.Context.tt包含一个DbContext对象,但它不包含与我的实体关联的DbSet <>集合.
如果我从我的解决方案中删除了两个.tt项目,然后右键单击设计器表面,选择Add Code Generation Item,并添加一个EF 5.x DbContext Generator,然后一切正常,我得到生成的类.
我已经确认我删除的*.tt文件实际上与我添加的那些文件相同.
任何智慧的话?这是一个错误,还是我错过了什么?
短发
我在scala中寻找一个从抽象语法树生成JavaScript的库.我想在最终生成JavaScript的编译器中使用它,我不想自己实现漂亮的打印部分.
我正在开发一个项目,该项目使用代码生成来使用基于文本的描述中的命令行工具生成C#类.我们将开始使用这些javascript描述.
目前生成这些类然后签入,但是,我希望能够自动生成代码,以便将任何更改传播到两个版本.
手动运行的步骤是:
servicegen.exe -i:MyService.txt -o:MyService.cs
Run Code Online (Sandbox Code Playgroud)
当我构建时,我希望MSBuild/VS首先生成CS文件然后编译它.可以通过修改csproj,或许使用MSBuild任务来实现这一点Exec,DependentUpon&AutoGen?
我想编写一个c ++矩阵操作代码,某些函数的某些操作是相同的.我想知道是否有一些方法可以合并它们?例如:
void add1(vector<vector<double> > &m){
for(int i = 0; i < m.size(); ++i){
for(int j = 0; j < m[i].size(); ++j){
m[i][j] += 1.0;
}
}
}
void minus1(vector<vector<double> > &m){
for(int i = 0; i < m.size(); ++i){
for(int j = 0; j < m[i].size(); ++j){
m[i][j] -= 1.0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这两段代码几乎相同.如何避免重写两次?是否有类似模板的东西可以自动生成代码?
code-generation ×10
c++ ×3
.net ×1
asp.net ×1
assembly ×1
attributes ×1
command-line ×1
gcc ×1
generics ×1
java ×1
javascript ×1
jit ×1
linux ×1
msbuild ×1
python ×1
scala ×1
signals ×1
templates ×1
web-services ×1
xsd ×1