标签: mini-language

可复合语法

有很多编程语言支持包含迷你语言.PHP嵌入在HTML中.XML可以嵌入JavaScript中.Linq可以嵌入C#中.正则表达式可以嵌入Perl中.

// JavaScript example
var a = <node><child/></node>
Run Code Online (Sandbox Code Playgroud)

想想看,大多数编程语言都可以建模为不同的迷你语言.例如,Java可以分为至少四种不同的迷你语言:

  • 类型声明langauge(包指令,导入指令,类声明)
  • 成员声明语言(访问修饰符,方法声明,成员变量)
  • 语句语言(控制流,顺序执行)
  • 表达语言(文字,作业,比较,算术)

能够将这四种概念语言实现为四种不同的语法肯定会减少我在复杂的解析器和编译器实现中经常看到的许多意义.

我之前已经为各种不同类型的语言实现了解析器(使用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解析器将定义一组完全不同于父解析器的标记化规则.如果您一次扫描一个令牌,您如何知道何时将控制权传递回母语词法分析器?

你们有什么感想?今天有哪些最佳技术可用于实现不同的,解耦的和可组合的语言语法,以便在较大的父语言中包含迷你语言?

dsl grammar parsing mini-language

8
推荐指数
1
解决办法
826
查看次数

将几何/路径转换为Minilanguage字符串?

跟踪如何以编程方式将路径字符串转换为WPF中的路径对象并不难,但是有没有内置函数将几何体或路径转换回迷你语言中的字符串?

wpf geometry xaml mini-language

5
推荐指数
1
解决办法
2773
查看次数

Python Float字符串格式不正常

我很确定我正确地这样做但没有得到我期望从Python 2.7.3字符串格式化迷你语言的结果.我正在尝试将float的输出格式化为3个整数值和不同数量的小数值.一切都有效,除了整数值.

单独使用以下代码可以获得3个整数值...

num = 3
value = '{:03}'.format(num)

returns '003'
Run Code Online (Sandbox Code Playgroud)

浮标工作......

num = 3.12345
value = '{:01.2f}'.format(num)

returns '3.12'
Run Code Online (Sandbox Code Playgroud)

但是,将两者结合起来似乎并不正常.小数精度有效,但整数精度不...

num = '3.12345'
value = '{:03.2f}'.format(num)

returns '3.12'

instead of the expected '003.12'
Run Code Online (Sandbox Code Playgroud)

如果我尝试以下任何格式,情况也是如此......

value = '{:03.02f}'.format(num)
- or -
value = '{0:3.2f}'.format(num)
- or -
value = '{:3.02f}'.format(num)
- or -
value = '{0:3.02f}'.format(num)
- or -
value = '{0:03.2f}'.format(num)
- or -
value = '{0:03.02f}'.format(num)
- or -
value = '{:0>3.2f}'.format(num)
etc...

Which all return the same …
Run Code Online (Sandbox Code Playgroud)

python string formatting mini-language

1
推荐指数
1
解决办法
2296
查看次数

标签 统计

mini-language ×3

dsl ×1

formatting ×1

geometry ×1

grammar ×1

parsing ×1

python ×1

string ×1

wpf ×1

xaml ×1