[Lazarus] How to write an eficient lexical scanner/parser?

Kostas Michalopoulos badsectoracula at gmail.com
Fri Mar 6 19:15:40 CET 2015


This is a classic series of articles that show how to write a very simple
compiler in Turbo Pascal. The fundamentals when it comes to scanning are
the same:

http://compilers.iecc.com/crenshaw/

I've also written a BASIC implementation for Free Pascal and Lazarus. The
scanner should be straightforward to understand:

http://runtimelegend.com/rep/rbasic/artifact/2350e85c36a77e4d2d76adde23fd7d45731b5b22

The compiler code shows how it can be used:
http://runtimelegend.com/rep/rbasic/artifact/93859f52fd424edfc1e0d5dfd16a92ed8ac04855

But you may also find the formatter code simpler. Although it is a bit too
simple:
http://runtimelegend.com/rep/rbasic/artifact/f3e9fb2d1ed8e60d36b50754c2d9a7d7c109fc40

For general theory you can look on recursive descent parsers (they're the
simplest to implement and AFAIK most compilers use them, either to build
the token list or directly).


On Fri, Mar 6, 2015 at 6:55 PM, silvioprog <silvioprog at gmail.com> wrote:

> Hello,
>
> I'm planning to write three parsers, and googling, I found some entries
> talking about lexical parsers.
>
> After that, I did a 'find in files' in FPC sources, and I found many
> parsers (eg: jsonparser (jsonscanner), JSParser (JSScanner), fpsqlparser
> (fpsqlscanner), PParser (PScanner), fpexprpars etc.) that use lexical
> scanner.
>
> Below, three possible string that I need to parse:
>
> 1)
>
> ${someVariable} -- 4 tokens
>
> or
>
> ${a + b} -- 8 tokens - 1 expression
>
> or
>
> ${fn:lenght('abc') * 3} -- 11 tokens - 1 function - 1 expression
>
> 2)
>
> <c:forEach var="contact" items="${contactDao.list}">
>     ${contato.name}, ${contato.email}
> </c:forEach>
>
> 3)
>
> contacts[0].name=abc
> contacts[0].email=abc at def
> contacts[1].name=def
> contacts[2].email=def at ghi
>
> So my parser will allow to register dynamic variables, functions (to be
> called via script) and plugins (to extend the parser).
>
> However, I have a question: is there any article about 'how to write
> lexical parsers' using Object Pascal?
>
> I need any material about this subject, and I'm very grateful for any tip.
>
> Thanks in advance!
>
> --
> Silvio Cl├ęcio
> My public projects - github.com/silvioprog
>
> --
> _______________________________________________
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20150306/f76a6548/attachment-0003.html>


More information about the Lazarus mailing list