From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Alin Soare Newsgroups: gmane.emacs.devel Subject: Possibility for a stream editor (sed) inside emacs ? Date: Wed, 25 May 2011 02:08:05 +0300 Message-ID: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=000e0cd48b9c21b01404a40da941 X-Trace: dough.gmane.org 1306278497 13260 80.91.229.12 (24 May 2011 23:08:17 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Tue, 24 May 2011 23:08:17 +0000 (UTC) To: Emacs Dev Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed May 25 01:08:13 2011 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1QP0hw-0003Mx-7m for ged-emacs-devel@m.gmane.org; Wed, 25 May 2011 01:08:12 +0200 Original-Received: from localhost ([::1]:49117 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QP0hv-00086L-IY for ged-emacs-devel@m.gmane.org; Tue, 24 May 2011 19:08:11 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]:51796) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QP0hs-00086C-N1 for emacs-devel@gnu.org; Tue, 24 May 2011 19:08:09 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QP0hr-0006xk-Es for emacs-devel@gnu.org; Tue, 24 May 2011 19:08:08 -0400 Original-Received: from mail-yx0-f169.google.com ([209.85.213.169]:53169) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QP0hr-0006xg-3m for emacs-devel@gnu.org; Tue, 24 May 2011 19:08:07 -0400 Original-Received: by yxt33 with SMTP id 33so3507937yxt.0 for ; Tue, 24 May 2011 16:08:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:date:message-id:subject:from:to :content-type; bh=6WaKsxBwFrxFUpgS4HI3zN5QtQn+C2sy8Scpor11rss=; b=xq4cBsFLtsf1AOe0p2NN4uPgl9IfkHJI+cKqoI0xdKUnp0nfjcJEvHk1kGDF7n1Mf1 XNdxDQ4s96Xq1et6Q4hxM/WuD8oXoA3ZJHA8Z3svruEE20zFWxKl+skIVHqQdoAO2iD1 R9z6QedI6AAUM+98ajOvWNc9x/l5NbBWpoQQo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=aDfzbBk/L+kva5s2PygigA87yvqfLj2Jj2tF64LNvAkZib4Q0vxI9ZqNJg+X2ZOSUA tmwzHu4LCqVwC5YyCkzjzb8hX6wCEs4IBvdEEqGfJRhvQnTvtB0lM/+/CG3kR37rZOoY gPg+AsVy2/6vkcoWMTx7ZN8FHF9JsT4N5x+kE= Original-Received: by 10.150.65.9 with SMTP id n9mr4732413yba.177.1306278485929; Tue, 24 May 2011 16:08:05 -0700 (PDT) Original-Received: by 10.150.211.2 with HTTP; Tue, 24 May 2011 16:08:05 -0700 (PDT) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 209.85.213.169 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:139686 Archived-At: --000e0cd48b9c21b01404a40da941 Content-Type: multipart/alternative; boundary=000e0cd48b9c21b00c04a40da93f --000e0cd48b9c21b00c04a40da93f Content-Type: text/plain; charset=UTF-8 Last 2 days I played, and I wrote a toy sed (stream-editor). I did use and learn sed, and to convince myself if I understood it, I wanted to write an own sed. My purpose was to write the machine that makes the computations, and not to write a complete sed. Its parser that generates tokens for example does not jump over the spaces. It's just a toy sed. The machine generates the internal structure that can be used by a virtual machine to render every sed command. I did not write neither the virtual machine (I wrote just a little sketch for a vm, and a sketch of lazy-evaluator of the special forms of conditional and non conditional branch "s label" and "t label"), and neither the action functions, that should be called by this machine via apply. I wrote only the kernel of sed. For me it became clear, and I do not want any more to work on. The virtual machine that evaluates the data structure that I generated can be written to use Emacs internal buffers or elisp strings, instead of files, as the GNU/sed does. The data structure I generated can also be used quite directly to generate the precise indentation of sed scripts, without defining the *action functions for every command, using the same logic I used when I wrote the indentation of lisp code ( ignored! ): http://permalink.gmane.org/gmane.emacs.devel/100252. I attach the backus-naur form I wrote last days. In order to understand the code, you have to look in the same time to bn-form. I wrote a major mode called "backus naur mode" to browse the backus-naur forms. The most difficult part of the implementation was to generate the graph with the mutual recursive function Command and Command_block. This is why I used artist-mode to draw a picture of the data structures, starting from atomic expressions of sed, upto the creation of the branches of Blocks. I attach the implementation of sed, and the grammar of sed in bn-form, and a file bn-mode.el , in order for those of you who are interested to be able to browse the grammar. I posted the bn-mode long time ago, but the post was ignored. Do you consider, an internal stream editor would be good for emacs? Alin --000e0cd48b9c21b00c04a40da93f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Last 2 days I played, and I wrote a toy sed (stream-editor). I did use = and learn sed, and to convince myself if I understood it, I wanted to write= an own sed.

My purpose was to write the machine that makes the comp= utations, and not to write a complete sed. Its parser that generates tokens= for example does not jump over the spaces. It's just a toy sed.

The machine generates the internal structure that can be used by a virt= ual machine to render every sed command.

I did not write neither the= virtual machine (I wrote just a little sketch for a vm, and a sketch of la= zy-evaluator of the special forms of conditional and non conditional branch= "s label" and "t label"), and neither the action funct= ions, that should be called by this machine via apply.=C2=A0 I wrote only the kernel of sed. For me it became clear, and I do not want a= ny more to work on.

The virtual machine that evaluates the data structure that I generated = can be written to use Emacs internal buffers or elisp strings, instead of f= iles, as the GNU/sed does.

The data structure I generated can also b= e used quite directly to generate the precise indentation of sed scripts, w= ithout defining the *action functions for every command, using the same log= ic I used when I wrote the indentation of lisp code ( ignored! ): http://permalink.g= mane.org/gmane.emacs.devel/100252.

I attach the backus-naur form I wrote last days. In order to understand= the code, you have to look in the same time to bn-form. I wrote a major mo= de called "backus naur mode" to browse the backus-naur forms. The= most difficult part of the implementation was to generate the graph with t= he mutual recursive function Command and Command_block. This is why I used = artist-mode to draw a picture of the data structures, starting from atomic = expressions of sed, upto the creation of the branches of Blocks.

I attach the implementation of sed, and the grammar of sed in bn-form, = and a file bn-mode.el , in order for those of you who are interested to be = able to browse the grammar. I posted the bn-mode long time ago, but the pos= t was ignored.

Do you consider, an internal stream editor would be good for emacs?




Alin





--000e0cd48b9c21b00c04a40da93f-- --000e0cd48b9c21b01404a40da941 Content-Type: application/x-bzip2; name="sed.tar.bz2" Content-Disposition: attachment; filename="sed.tar.bz2" Content-Transfer-Encoding: base64 X-Attachment-Id: f_go3gfwl80 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 KEge7BIBgA== --000e0cd48b9c21b01404a40da941--