2

我正在尝试开发一个管理面板并且我有一个命令行。当用户发送如下命令时,我需要使用 PHP 识别它。

我的目标是简化管理面板中的任务。

 create page -attr1 90 -attr2 'page title';

或者

 update category 90 -name 'Technology';

主要有两点:

  1. 动词和主语(即创建页面、更新类别)
  2. 属性(可以是 STRING 和 INT)

和更复杂的例子:

create page -name EN:'Static Page' CA:'Statična Stranica' -category 3,6,12,15;

我可以从哪里开始创建这种非常小的嵌入式语言,或者我怎样才能真正做好呢?

聪明的答案,请。

4

4 回答 4

3

假设这个命令行是交互式的,你就给自己设置了不小的任务。本质上,您将不得不编写一个解释器。假设词法分析是微不足道的,除了命令集背后的代码之外,您将花费大部分时间编写解析器。

如果您的命令行交互性最低,并且您的命令词汇量相对较小(大约为几个命令),您可以使用正则表达式编写一个简单的识别器。鉴于您允许的参数示例,正则表达式可能会很快变得粗糙。在那种情况下,或者在你的词汇量有点大的情况下(超过几个,可能少于 20 或 30 个——作为在黑暗中站不住脚的刺),你可能需要转移到一个简单的状态——基于解析器,将令牌从命令行中拉出,直到出现错误或可以处理的完整命令。

它的失控程度完全取决于您使命令词汇及其参数变得多么复杂。如果你到了需要用 ANTLR 之类的东西编写语法的地步,那么你已经走得太远了,可能正在构建一种新的编程语言。:-)

于 2010-12-31T09:48:03.427 回答
1

一次只接收一个 var,然后根据对该单个 var 的验证来接受或拒绝它,然后如果接受它来执行下一个任务,则最终继续前进(无论是开始一个序列还是询问另一个 var 的用户)。

http://en.wikipedia.org/wiki/Finite-state_machine

这种方法会减少大量的解析,并且很容易维护。

于 2010-12-31T17:12:05.467 回答
1

为了简单起见,我会使用:

$args = explode(' ',$yourstring);
$cmd = array_shift($args);
//use function or class now upon requested cmd.
//pass the args, just as any bash...

问候,//t

于 2010-12-31T09:43:00.067 回答
1

我认为它有很多工作......你必须先在“-”处分割字符串。$Split_string = explode("-", $cmd_line_input); 那么您应该检查要包含在命令行中的动词的第一个字符串,然后进行不同的情况: Verb_array = explode(" ", $Split_string[0]); 开关($Verb_array[1])

案例创建:在此处创建页面并在发现动词时发现属性?我在我的 ipod 上,所以我不能把它全部写出来,但我认为你可以从这个开始

于 2010-12-31T09:33:21.817 回答