有很多编程语言支持包含迷你语言.PHP嵌入在HTML中.XML可以嵌入JavaScript中.Linq可以嵌入C#中.正则表达式可以嵌入Perl中.
// JavaScript example
var a = <node><child/></node>
Run Code Online (Sandbox Code Playgroud)
想想看,大多数编程语言都可以建模为不同的迷你语言.例如,Java可以分为至少四种不同的迷你语言:
能够将这四种概念语言实现为四种不同的语法肯定会减少我在复杂的解析器和编译器实现中经常看到的许多意义.
我之前已经为各种不同类型的语言实现了解析器(使用ANTLR,JavaCC和自定义递归下降解析器),当语言变得非常庞大和复杂时,你通常会得到一个huuuuuuge语法,并且解析器实现得到非常难看真的很快.
理想情况下,在为其中一种语言编写解析器时,最好将它作为可组合解析器的集合实现,在它们之间来回传递控制.
棘手的是,通常,包含语言(例如,Perl)为包含的语言(例如,正则表达式)定义其自己的终点标记.这是一个很好的例子:
my $result ~= m|abc.*xyz|i;
Run Code Online (Sandbox Code Playgroud)
在此代码中,主perl代码定义了一个非标准的终端"|" 用于正则表达式.实现与perl解析器完全不同的正则表达式解析器将非常困难,因为正则表达式解析器不知道如何在不咨询父解析器的情况下找到表达式终结符.
或者,假设我有一种允许包含Linq表达式的语言,但不是用分号终止(如C#所做的那样),我想强制Linq表达式出现在方括号内:
var linq_expression = [from n in numbers where n < 5 select n]
Run Code Online (Sandbox Code Playgroud)
如果我在父语言语法中定义了Linq语法,我可以轻松地使用语法前瞻为"LinqExpression"编写一个明确的生成来查找括号外壳.但是我的父语法必须吸收整个Linq规范.这是一个阻力.另一方面,单独的子Linq解析器将很难确定停止的位置,因为它需要为外部令牌类型实现前瞻.
这几乎排除了使用单独的lexing/parsing阶段,因为Linq解析器将定义一组完全不同于父解析器的标记化规则.如果您一次扫描一个令牌,您如何知道何时将控制权传递回母语词法分析器?
你们有什么感想?今天有哪些最佳技术可用于实现不同的,解耦的和可组合的语言语法,以便在较大的父语言中包含迷你语言?
在XSLT中,有没有办法在处理元素时确定XML文档的位置?
示例:给出以下XML Doc Fragment ...
<Doc>
<Ele1>
<Ele11>
<Ele111>
</Ele111>
</Ele11>
</Ele1>
<Ele2>
</Ele2>
</Doc>
Run Code Online (Sandbox Code Playgroud)
在XSLT中,如果我的上下文是元素"Ele111",我如何让XSLT输出完整路径?我希望它输出:"/ Doc/Ele1/Ele11/Ele111".
这个问题的上下文:我有一个非常大,非常深的文档,我想详尽地遍历(一般使用递归),如果我找到一个具有特定属性的元素,我想知道我在哪里找到它.我想我可以随身携带当前的路径,但我认为XSLT/XPath应该知道.
有可能实现?? ?? Ruby中的运算符?
a = nil
b = 1
x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
Run Code Online (Sandbox Code Playgroud) 我正在通过将它们转换为编译查询来加速Linq到SQL查询在Web应用程序中的过程,我遇到了转换一个非常简单的语句的问题.
我想编译一个简单的语句,它使用以下参数从数据库中获取有效的员工:
TestParams myParams = new TestParams
{
ValidEmps = new int[] { 1, 2, 3 }
};
Run Code Online (Sandbox Code Playgroud)
这是工作查询:
IQueryable<Employees> MySelectedEmps =
from emps in db.Employees
where myParams.ValidEmps.Contains(emps.EmployeeID)
select emps;
Run Code Online (Sandbox Code Playgroud)
这是我尝试编译它:
private static Func<MyDataContext, TestParams, IQueryable<Employee>> myCompiledQuery =
CompiledQuery.Compile((MyDataContext db, TestParams myParams) =>
from emps in db.Employees
where myParams.ValidEmps.Contains(emps.EmployeeID)
select emps);
Run Code Online (Sandbox Code Playgroud)
这个语句有编译和构建,但是当我运行它时,我收到以下运行时错误:
类型'System.Int32 []'不支持比较运算符
我也尝试使用相同的错误消息传递List和IEnumerable.
我也尝试用.Any(valemp => valemp == emps.EmployeeID)语句替换.Contains语句但我仍然得到相同的错误.
是否可以使用等效的SQL"IN"语句编译查询?我究竟做错了什么?
我对TDD很新,我在单元测试中遇到了麻烦.我似乎无法理解下一步该做什么.:(我正在尝试对我的一个名为AccountService的服务进行单元测试,我正在测试一个名为DoLogin的方法(用户名,密码).这是一些示例代码:
[Test]
public void User_With_Correct_Username_And_Pass_Should_Login_Successfully()
{
// Arrange
var accountService = new AccountService();
// Act
bool result = accountService.DoLogin("test", "test");
// Assert
Assert.IsTrue(result);
}
public class AccountService : IAccountService
{
public bool DoLogin(string username, string password)
{
if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
return false;
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
所以这个测试过去但现在我该怎么办?!如果发生有效登录,我该如何测试呢?我是否需要实现集成测试并针对实际或内存数据库测试登录?对不起,如果我做的事情完全不正确.我真的希望有一天得到这个TDD的东西.谢谢
我在考虑懒惰单例初始化的经典问题 - 完全无效的问题:
if (instance == null)
{
instance = new Foo();
}
return instance;
Run Code Online (Sandbox Code Playgroud)
任何知道Singleton是什么的人都熟悉这个问题(你只需要if一次).这是微不足道的,但很刺激.
所以,我想到了一个替代解决方案,至少对于.NET来说(尽管它应该可以在任何具有等效功能指针的地方工作:
public class Foo
{
private delegate Foo FooReturner();
private static Foo innerFoo;
private static FooReturner fooReturnHandler = new FooReturner(InitialFooReturner);
public static Foo Instance
{
get
{
return fooReturnHandler();
}
}
private static Foo InitialFooReturner()
{
innerFoo = new Foo();
fooReturnHandler = new FooReturner(NewFooReturner);
return innerFoo;
}
private static Foo NewFooReturner()
{
return innerFoo;
}
}
Run Code Online (Sandbox Code Playgroud)
简而言之 - Instance返回一个委托方法.委托最初设置为初始化实例的方法,然后将委托更改为指向简单的Return方法.
现在,我喜欢认为我的工作并不可怕,但我并不担心自己很棒.我没有在任何地方看到这个代码的例子.
因此,我得出结论,我错过了一些东西.重要的东西.要么整个问题太过微不足道,要么不必考虑太多,或者这会造成毁灭宇宙的可怕事情.或者我在搜索时失败,因此没有看到数百名开发人员使用这种方法.无论如何,还有什么.
我希望Stack Overflow这里的优秀人员可以让我知道什么(除了关于是否应该使用Singleton的争议).
编辑澄清: …
我有一些代码用于以编程方式创建一个文档发送到打印机.它是这样的:
private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev)
{
ev.Graphics.DrawImage(pictureBox1.Image, 50, 100);
string drawToday="Date : "+strToday;
string drawPolicyNo="Policy # : " + strPolicyNo;
string drawUser="User : " + strUser;
Font drawFont=new Font("Arial",30);
SolidBrush drawBrush=new SolidBrush(Color.Black);
PointF drawPointToday=new Point(50,400);
PointF drawPointPolicyNo=new Point(50,450);
PointF drawPointUser=new Point(50,500);
ev.Graphics.DrawString(drawToday,drawFont,drawBrush,drawPointToday);
ev.Graphics.DrawString(drawPolicyNo,drawFont,drawBrush,drawPointPolicyNo);
ev.Graphics.DrawString(drawUser,drawFont,drawBrush,drawPointUser);
}
Run Code Online (Sandbox Code Playgroud)
它的有效代码,但现在我需要执行相同的过程,而是将其写入图像文件,以便可以将其发送到浏览器并从那里打印.重用这段代码应该相对简单,但不幸的是,我正在挂起用于替换PrintPageEventArgument的绘图表面.
谢谢
编辑:谢谢我得到的我只需要另一个Graphics对象,但Graphics对象本身没有公共构造函数,所以我要找的是关于我需要什么对象才能创建Graphics对象的建议借鉴.我想也许是位图?位图当然是基于像素而不是基于点的,所以我不确定这是最好的介质.
我们有一个带有Apache的Linux机器,运行PHP.我们在运行Quickbooks Enterprise Edition 9.0的网络中有一台普通的台式计算机.
我正在尝试构建一个托管在Linux机器上的自定义Web应用程序,它可以与Quickbooks通信.
我是Quickbooks的新手,这对我来说很难.环顾四周,我发现了很多技术,但看起来并不简单.在我深入研究之前,我想知道是否有人有这方面的经验并且可以在第一步告诉我.
我听说过Quickbooks SDK,QODBC,Web Connector等......对这些技术和其他可用产品的澄清将非常好.还要记住PHP代码将在不同的计算机(linux)中运行.
谢谢
PS.我知道已有其他与Quickbooks相关的帖子,但它们要么不够清晰,要么涉及与Quickbooks在同一台机器上运行的Web代码.
我在javascript中有一个数组.此数组包含逗号(",")的字符串.我希望从这个数组中删除所有逗号.可以这样做吗?