7

我正在考虑如何为我为 CSS 和 JS 找到的几个库创建一个 PHP 等效项。

一个是Less CSS哪个是一个dynamic stylesheet language。背后的基本思想Less CSS是,它允许您创建更多动态的 CSS 规则,其中包含“常规” CSS 不支持的实体,例如mixins,functions等,然后最终将这些语法Less CSS 编译成常规 CSS。

另一个以(某种)类似模式运行的有趣 JS 库是CoffeeScript您可以在其中编写“更整洁且更简单”的代码,然后将其编译为常规 Javascript。

如何为 PHP 创建一个简单的类似接口?就像概念证明一样;我只是想学习一些东西。让我们看一个扩展类的简单用例。

class a
{
    function a_test()
    {
        echo "This is test in a ";
    }
}

class b extends a
{
    function b_test()
    {
        parent::a_test();
        echo "This is test in b";
    }
}

$b = new b();
$b->b_test();

假设我想让用户将类写b为(仅用于示例):

class b[a] //would mean b extends a
{
    function b_test()
    {
        [a_test] //would mean parent::a_test()
        echo "This is test in b";
    }
}

并让他们稍后将该代码“解析”为常规 PHP(我相信通常通过运行单独的命令/进程)。我的问题是我将如何去创造这样的东西。可以用 PHP 完成吗,我需要使用 C/C++ 之类的东西吗?如果我要解决这个问题,我应该如何解决?网上有资源吗?任何指针都非常感谢!

4

1 回答 1

8

语言转码器并不像人们想象的那么容易。

您提供的示例可以使用preg_replace查找类定义并替换[a]extends a.

但是更复杂的功能需要一个转码器,它是一套较小的逻辑代码片段。

在大多数程序员行话中,人们错误地将转码器称为编译器,但编译器和转码器之间的区别在于编译器读取源代码并输出原始二进制机器代码,而转码器读取源代码并输出(不同的)源代码。

例如,PHP(或 JavaScript)运行时既不是编译器也不是转码器,它是一个解释器。

但是关于行话已经够多了,让我们来谈谈转码器:

要构建转码器,您必须首先构建一个标记器,它将源代码分解为标记,这意味着如果它看到一个完整的单词,例如“类”或类的名称或“函数”或函数的名称,它捕获该词并将其视为标记。当它遇到另一个标记时,例如左圆括号或左大括号或方括号等,它认为是另一个标记。

幸运的是,PHP 中可用的所有可识别标记都已被token_get_all轻松扫描,这是 PHP 捆绑的一个函数。你可能会遇到一些麻烦,因为 PHP 假设了一些关于你如何使用符号的事情,但总的来说你可以使用这个函数。

标记器创建它找到的所有标记的平面列表并将其提供给解析器。

解析器是转码器的第二阶段,它读取令牌列表并决定诸如“如果令牌 [0] 是一个类并且令牌 [1] 是一个 name_value 那么我们有一个类”等内容。在运行完整个令牌列表我们应该有一个抽象语法树。

抽象语法树是一种仅象征性地保留有关源代码的相关信息的结构。

$ast = array(
    'my_derived_class' => array(
        'implements' => array(
            'my_interface_1',
            'my_interface_2',
            'my_interface_3'),
        'extends' => 'my_base_class',
        'members' => array(
            'my_property_name' => 'my_default_value',
            'my_method_name' => array( /* ... */ )
        )
    )
);

获得抽象语法树后,您需要遍历它并输出目标源代码。

真正棘手的部分是解析器(取决于您正在解析的语言的复杂性)可能需要回溯算法或其他形式的模式匹配来区分相似的情况。

我建议在 Terence Parr 的书http://pragprog.com/book/tpdsl/language-implementation-patterns中阅读有关此内容的内容,该书详细描述了编写代码转换器所需的设计模式。

在 Terrence 的书中,您将了解为什么某些语言(如 HTML 或 CSS)比 PHP 或 JavaScript 简单得多(在结构上),以及这与语言解析器的复杂性有何关系。

于 2012-10-03T21:37:57.960 回答